git-svn-id: file:///home/ksmith/gitmigration/svn/xmpp/trunk@1390 4b5297f7-1745-476d-ba37-a9c6900126ab
This commit is contained in:
Peter Saint-Andre 2007-11-19 21:13:21 +00:00
parent 32380067c6
commit 535ae14637
1 changed files with 215 additions and 64 deletions

View File

@ -29,10 +29,10 @@
&stpeter;
&dizzyd;
<revision>
<version>1.1pre2</version>
<date>2007-08-15</date>
<version>1.1pre3</version>
<date>2007-11-19</date>
<initials>psa</initials>
<remark>Clarified that username used for registration is legacy user address; added optional support for specifying roster group name for contact list items sent via roster item exchange.</remark>
<remark>Clarified that username used for registration is legacy user address; added optional support for specifying roster group name for contact list items sent via roster item exchange, either directly for legacy services that do not support groups or indirectly via a group name modifier and location (prefix or suffix) for legacy services that support groups.</remark>
</revision>
<revision>
<version>1.0</version>
@ -163,7 +163,7 @@
<p>Jabber User sends IQ-get qualified by the &xep0030; information namespace to the Gateway, and/or IQ-get qualified by the &xep0094; namespace to the Gateway's parent (the latter method is deprecated but still in use).</p>
<example caption="User Queries Gateway Regarding Service Discovery Identity"><![CDATA[
<iq type='get'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='disco1'>
<query xmlns='http://jabber.org/protocol/disco#info'/>
@ -171,7 +171,7 @@
]]></example>
<example caption="User Queries Gateway's Parent Regarding Agent Information"><![CDATA[
<iq type='get'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='shakespeare.lit'
id='agent1'>
<query xmlns='jabber:iq:agents'/>
@ -184,7 +184,7 @@
<example caption="Gateway Returns Service Discovery Identity"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='disco1'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity category='gateway'
@ -199,7 +199,7 @@
]]></example>
<example caption="Gateway's Parent Returns Agent Information"><![CDATA[
<iq type='result'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='shakespeare.lit'
id='agent1'>
<query xmlns='jabber:iq:agents'>
@ -218,7 +218,7 @@
<p>Jabber User sends IQ-get qualified by the &xep0077; (jabber:iq:register) namespace to Gateway.</p>
<example caption="User Queries Gateway Regarding Registration Requirements"><![CDATA[
<iq type='get'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='reg1'>
<query xmlns='jabber:iq:register'/>
@ -230,7 +230,7 @@
<example caption="Gateway Returns Registration Requirements"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='reg1'>
<query xmlns='jabber:iq:register'>
<instructions>
@ -246,7 +246,7 @@
<p>Jabber User sends IQ-set qualified by the 'jabber:iq:register' namespace to Gateway, containing information required to register.</p>
<example caption="User Provides Registration Information"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='reg2'>
<query xmlns='jabber:iq:register'>
@ -262,7 +262,7 @@
<example caption="Gateway Informs Jabber User of Success"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='reg2'/>
]]></example>
</li>
@ -271,7 +271,7 @@
<p>Optionally, Jabber User sends IQ-set qualified by the 'jabber:iq:roster' namespace to its server (see &rfc3921;), containing a roster item for Gateway.</p>
<example caption="User Creates Roster Entry"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
id='roster1'>
<query xmlns='jabber:iq:roster'>
<item jid='aim.shakespeare.lit' name='AIM Gateway'/>
@ -280,7 +280,7 @@
]]></example>
<example caption="Server Response"><![CDATA[
<iq type='result'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='roster1'/>
]]></example>
</li>
@ -289,14 +289,14 @@
<example caption="Gateway Subscribes to User's Presence"><![CDATA[
<presence type='subscribe'
from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
<p>Jabber User's client SHOULD approve the subscription request (i.e., by sending a presence stanza of type "subscribed" to Gateway).</p>
<example caption="Jabber User Approves Subscription Request"><![CDATA[
<presence type='subscribed'
from='romeo@montague.net'
from='romeo@montague.lit'
to='aim.shakespeare.lit'/>
]]></example>
<p>Note: As specified in <cite>RFC 3921</cite>, Jabber User's server will generate a "roster push" at this point if client did not previously perform a roster set to add Gateway to user's roster (as mentioned above).</p>
@ -305,7 +305,7 @@
<p>Jabber User sends subscription request to Gateway (i.e., by sending a presence stanza of type "subscribe" to Gateway).</p>
<example caption="Jabber User Subscribes to Gateway&apos;s Presence"><![CDATA[
<presence type='subscribe'
from='romeo@montague.net'
from='romeo@montague.lit'
to='aim.shakespeare.lit'/>
]]></example>
</li>
@ -314,7 +314,7 @@
<example caption="Gateway Approves Subscription Request"><![CDATA[
<presence type='subscribed'
from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li><p>Execute "Log In" use case.</p></li>
@ -331,7 +331,7 @@
<example caption="Gateway Informs Jabber User of Registration Error"><![CDATA[
<iq type='error'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='reg2'>
<query xmlns='jabber:iq:register'>
<username>RomeoMyRomeo</username>
@ -358,7 +358,7 @@
<p>Jabber User sends IQ-get qualified by the 'jabber:iq:register' namespace to Gateway.</p>
<example caption="User Queries Gateway Regarding Registration Requirements"><![CDATA[
<iq type='get'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='edit1'>
<query xmlns='jabber:iq:register'/>
@ -370,7 +370,7 @@
<example caption="Gateway Returns Registration Information of Record"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='edit1'>
<query xmlns='jabber:iq:register'>
<registered/>
@ -384,7 +384,7 @@
<p>Jabber User sends IQ-set qualified by the 'jabber:iq:register' namespace to Gateway, containing all information (i.e., not just the "delta").</p>
<example caption="User Provides Registration Information"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='edit2'>
<query xmlns='jabber:iq:register'>
@ -399,7 +399,7 @@
<example caption="Gateway Informs Jabber User of Success"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='edit2'/>
]]></example>
</li>
@ -414,7 +414,7 @@
<example caption="Gateway Informs Jabber User of Registration Error"><![CDATA[
<iq type='error'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='edit2'>
<query xmlns='jabber:iq:register'>
<username>RomeoMyRomeo</username>
@ -441,7 +441,7 @@
<p>Jabber User sends IQ-set in 'jabber:iq:register' namespace to Gateway, containing empty &lt;remove/&gt; element.</p>
<example caption="User Unregisters"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='unreg1'>
<query xmlns='jabber:iq:register'>
@ -457,7 +457,7 @@
<example caption="Gateway Informs Jabber User of Success"><![CDATA[
<iq type='result'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'
to='romeo@montague.lit/orchard'
id='unreg1'/>
]]></example>
</li>
@ -466,11 +466,11 @@
<example caption="Gateway Cancels Subscriptions"><![CDATA[
<presence type='unsubscribe'
from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
<presence type='unsubscribed'
from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
@ -478,7 +478,7 @@
<example caption="Gateway Logs User Out"><![CDATA[
<presence type='unavailable'
from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li><p>Jabber User's client SHOULD delete from the user's roster (1) the gateway itself, and (2) all legacy Contacts associated with the gateway.</p></li>
@ -499,9 +499,9 @@
<presence/>
]]></example>
<example caption="Jabber User's Server Broadcasts Available Presence"><![CDATA[
<presence from='romeo@montague.net/orchard'
<presence from='romeo@montague.lit/orchard'
to='juliet@aim.shakespeare.lit'/>
<presence from='romeo@montague.net/orchard'
<presence from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'/>
...
]]></example>
@ -511,7 +511,7 @@
<p>Gateway sends presence stanza to Jabber User expressing availability.</p>
<example caption="Gateway Sends Presence to Jabber User"><![CDATA[
<presence from='aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li><p>Optionally, Gateway handles Legacy Service contact list; see the <link url="#rosters">Contact Lists</link> section of this document.</p></li>
@ -519,7 +519,7 @@
<p>Gateway forwards current presence information from Legacy Users to Jabber User, if possible mapping availability status (e.g., "away").</p>
<example caption="Gateway Sends Presence from Legacy Users to Jabber User"><![CDATA[
<presence from='juliet@aim.shakespeare.lit'
to='romeo@montague.net'>
to='romeo@montague.lit'>
<show>away</show>
</presence>
]]></example>
@ -528,7 +528,7 @@
<li>
<p>Gateway forwards all subsequent presence stanzas to Legacy Users (except those of type "probe" and those addressed to the Gateway itself).</p>
<example caption="Jabber User Modifies Presence"><![CDATA[
<presence from='romeo@montague.net/orchard'
<presence from='romeo@montague.lit/orchard'
to='juliet@aim.shakespeare.lit'>
<show>dnd</show>
<status>Wooing Juliet</status>
@ -572,7 +572,7 @@
]]></example>
<example caption="Jabber User's Server Broadcasts Unavailable Presence"><![CDATA[
<presence type='unavailable'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'/>
]]></example>
</li>
@ -583,7 +583,7 @@
<example caption="Gateway Logs User Out"><![CDATA[
<presence type='unavailable'
from='aim.shakespeare.lit'
to='romeo@montague.net/orchard'/>
to='romeo@montague.lit/orchard'/>
]]></example>
</li>
<li><p>Use Case Ends.</p></li>
@ -597,7 +597,7 @@
<p>Gateway passes through directed unavailable presence to Legacy User.</p>
<example caption="Jabber User Becomes Unavailable"><![CDATA[
<presence type='unavailable'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='juliet@aim.shakespeare.lit'/>
]]></example>
</li>
@ -615,7 +615,7 @@
<p>Jabber User sends presence stanza of type "subscribe" to Legacy User.</p>
<example caption="Jabber User Sends Subscription Request to Legacy User"><![CDATA[
<presence type='subscribe'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
<p>Note: As specified in <cite>RFC 3921</cite>, sending this packet will result in a "roster push" from the Server to all of the Jabber User's available resources.</p>
@ -626,14 +626,14 @@
<example caption="Gateway Approves Subscription Request on Behalf of Legacy User"><![CDATA[
<presence type='subscribed'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
<p>Gateway sends available presence stanza to Jabber User on behalf of Legacy User.</p>
<example caption="Gateway Sends Legacy User's Current Presence Information to Jabber User"><![CDATA[
<presence from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net/orchard'/>
to='romeo@montague.lit/orchard'/>
]]></example>
</li>
<li>
@ -641,14 +641,14 @@
<example caption="Gateway Sends Subscription Request to Jabber User on Behalf of Legacy User"><![CDATA[
<presence type='subscribe'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
<p>Jabber User sends presence stanza of type "subscribed" to Legacy User.</p>
<example caption="Jabber User Approves Subscription Request"><![CDATA[
<presence type='subscribed'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
</li>
@ -665,7 +665,7 @@
<example caption="Legacy User Denies Subscription Request"><![CDATA[
<presence type='unsubscribed'
from='juliet@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li><p>Use Case Ends unsuccessfully.</p></li>
@ -682,7 +682,7 @@
<p>Jabber User sends IQ-set qualified by the 'jabber:iq:roster' namespace, containing subscription attribute with value of "remove".</p>
<example caption="User Removes Roster Entry for Legacy User"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
id='remove1'>
<query xmlns='jabber:iq:roster'>
<item jid='CapuletNurse@aim.shakespeare.lit'
@ -695,15 +695,15 @@
<p>Server sends normal "roster push" to Jabber User (see <cite>RFC 3921</cite>) and sends presence stanzas of type "unsubscribe", "unsubscribed", and "unavailable" to Legacy User.</p>
<example caption="Server Sends Presence Changes to Legacy User"><![CDATA[
<presence type='unsubscribe'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
<presence type='unsubscribed'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
<presence type='unavailable'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
</li>
@ -722,7 +722,7 @@
<li>
<p>Jabber User sends message stanza to Legacy User.</p>
<example caption="Jabber User Sends Message to Legacy User"><![CDATA[
<message from='romeo@montague.net/orchard'
<message from='romeo@montague.lit/orchard'
to='juliet@aim.shakespeare.lit'
type='chat'>
<body>Neither, fair saint, if either thee dislike.</body>
@ -761,14 +761,14 @@
<example caption="Gateway Sends Subscription Request on Behalf of Legacy User"><![CDATA[
<presence type='subscribe'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
<p>Jabber User approves subscription request by sending presence stanza of type "subscribed" to Legacy User [A1].</p>
<example caption="Jabber User Approves Subscription Request"><![CDATA[
<presence type='subscribed'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
</li>
@ -777,7 +777,7 @@
<p>Jabber User's Client sends presence stanza of type "subscribe" to Legacy User.</p>
<example caption="Jabber User Sends Subscription Request to Legacy User"><![CDATA[
<presence type='subscribe'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
</li>
@ -786,14 +786,14 @@
<example caption="Gateway Approves Subscription Request on Behalf of Legacy User"><![CDATA[
<presence type='subscribed'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
]]></example>
</li>
<li>
<p>Gateway sends Legacy User's presence information to Jabber User.</p>
<example caption="Gateway Sends Legacy User's Current Presence Information to Jabber User"><![CDATA[
<presence from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net/orchard'/>
to='romeo@montague.lit/orchard'/>
]]></example>
</li>
<li><p>Use Case Ends.</p></li>
@ -807,7 +807,7 @@
<p>Jabber User sends presence stanza of type "unsubscribed" to Legacy User.</p>
<example caption="Jabber User Denies Subscription Request"><![CDATA[
<presence type='unsubscribed'
from='romeo@montague.net'
from='romeo@montague.lit'
to='CapuletNurse@aim.shakespeare.lit'/>
]]></example>
</li>
@ -828,15 +828,15 @@
<example caption="Gateway Cleans Up Subscription on Behalf of Legacy User"><![CDATA[
<presence type='unsubscribe'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
<presence type='unsubscribed'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net'/>
to='romeo@montague.lit'/>
<presence type='unavailable'
from='CapuletNurse@aim.shakespeare.lit'
to='romeo@montague.net/orchard'/>
to='romeo@montague.lit/orchard'/>
]]></example>
</li>
<li><p>Jabber User's server performs defined functionality for handling presence stanzas of type "unsubscribe" and "unsubscribed" (see <cite>RFC 3921</cite>).</p></li>
@ -856,7 +856,7 @@
<p>Gateway transforms message and routes to Jabber User.</p>
<example caption="Legacy User Sends Message to Jabber User"><![CDATA[
<message from='juliet@aim.shakespeare.lit'
to='romeo@montague.net'>
to='romeo@montague.lit'>
<body>Art thou not Romeo, and a Montague?</body>
</message>
]]></example>
@ -960,11 +960,51 @@
</section2>
</section1>
<section1 topic='Contact Lists' anchor='rosters'>
<p>Some legacy services maintain server-side contact lists, which are sent to the gateway when it logs in to the legacy service on behalf of the user. The gateway MAY initiate adding of the legacy contact list items to the user's Jabber roster. Some existing gateways do this by sending a presence stanza of type "subscribed" from the legacy contact's JID (e.g., &lt;LegacyUser@gateway.jabberserver.com&gt;) to the Jabber user; unfortunately, this behavior violates the presence stanza handling rules specified in <cite>RFC 3921</cite>. Therefore, a gateway SHOULD instead send the legacy contact list items to the Jabber User via the &xep0144; protocol.</p>
<p>In order to inform the gateway of the user's desired roster group for the contacts to be sent, the user's client MAY include a field of "group" in the data form it sends when registering with the gateway (if the gateway provides a data form in the registration requirements stanza).</p>
<example caption="User Provides Registration Information"><![CDATA[
<section2 topic='Adding Items by the Gateway' anchor='rosters-add'>
<p>Some legacy services maintain server-side contact lists, which are sent to the gateway when it logs in to the legacy service on behalf of the user. The gateway MAY initiate adding of the legacy contact list items to the user's Jabber roster. Some existing gateways do this by sending a presence stanza of type "subscribed" from the legacy contact's JID (e.g., &lt;LegacyUser@gateway.jabberserver.com&gt;) to the Jabber user; unfortunately, this behavior violates the presence stanza handling rules specified in <cite>RFC 3921</cite>. Therefore, a gateway SHOULD instead send the legacy contact list items to the Jabber User via the &xep0144; protocol.</p>
<example caption='Suggesting Addition of a Roster Item'><![CDATA[
<message from='aim.shakespeare.lit' to='romeo@montague.lit'>
<x xmlns='http://jabber.org/protocol/rosterx'>
<item action='add' jid='CapuletNurse@aim.shakespeare.lit'/>
</x>
</message>
]]></example>
</section2>
<section2 topic='Group Names' anchor='rosters-groups'>
<p>There are two scenarios for gateway handling of roster groups: either (1) the legacy service does not support groups or (2) the legacy service supports groups.</p>
<p>If the legacy service does not support categorization of contact list items into groups (equivalent to XMPP roster groups), then a gateway that handles communications with such a legacy service SHOULD enable the user to specify his or her desired roster group for those items by providing a field of "group" in the data form it provides to the user on registration.</p>
<example caption="Gateway Provides Registration Form With Group Name Field"><![CDATA[
<iq from='aim.shakespeare.lit'
id='reg1'
to='romeo@montague.lit/orchard'
type='result'>
<query xmlns='jabber:iq:register'>
<instructions>
Use the enclosed form to register. If your Jabber client does
not support Data Forms, visit http://www.shakespeare.lit/
</instructions>
<x xmlns='jabber:x:data' type='form'>
<instructions>
Please provide the following information
to register with the AIM gatway.
</instructions>
<field type='hidden' var='FORM_TYPE'>
<value>jabber:iq:register</value>
</field>
<field type='text-single' label='AIM User Name' var='username'>
<required/>
</field>
<field type='text-private' label='Password' var='password'>
<required/>
</field>
<field type='text-single' label='Roster Group Name' var='groupname'/>
</x>
</query>
</iq>
]]></example>
<example caption="User Provides Registration Information With Group Name Field"><![CDATA[
<iq type='set'
from='romeo@montague.net/orchard'
from='romeo@montague.lit/orchard'
to='aim.shakespeare.lit'
id='reg2'>
<query xmlns='jabber:iq:register'>
@ -978,13 +1018,98 @@
<field var='password'>
<value>ILoveJuliet</value>
</field>
<field var='group'>
<value>AIM (Work)</value>
<field var='groupname'>
<value>AIM (Home)</value>
</field>
</x>
</query>
</iq>
]]></example>
]]></example>
<p>When the gateway sends roster items to the user, it SHOULD then include the specified group.</p>
<example caption='Suggesting Addition of a Roster Item'><![CDATA[
<message from='aim.shakespeare.lit' to='romeo@montague.lit'>
<x xmlns='http://jabber.org/protocol/rosterx'>
<item action='add' jid='CapuletNurse@aim.shakespeare.lit'>
<group>AIM (Home)</group>
</item>
</x>
</message>
]]></example>
<p>However, if the legacy service supports groups, then a gateway that handles communications with such a legacy service SHOULD enable the user to specify his or her desired roster group prefix or suffix for those items by providing fields of both "group" and "groupmodify" in the data form it provides to the user on registration.</p>
<example caption="Gateway Provides Registration Form With Group Name and Group Modify Fields"><![CDATA[
<iq from='msn.shakespeare.lit'
id='reg3'
to='romeo@montague.lit/orchard'
type='result'>
<query xmlns='jabber:iq:register'>
<instructions>
Use the enclosed form to register. If your Jabber client does
not support Data Forms, visit http://www.shakespeare.lit/
</instructions>
<x xmlns='jabber:x:data' type='form'>
<instructions>
Please provide the following information
to register with the MSN gateway.
</instructions>
<field type='hidden' var='FORM_TYPE'>
<value>jabber:iq:register</value>
</field>
<field type='text-single' label='AIM User Name' var='username'>
<required/>
</field>
<field type='text-private' label='Password' var='password'>
<required/>
</field>
<field type='text-single' label='Roster Group Modifier' var='groupmodifier'/>
<field type='list-single' label='Location of Roster Group Modifier' var='groupmodifylocation'>
<option label='Prefix'>
<value>prefix</value>
</option>
<option label='Suffix'>
<value>suffix</value>
</option>
</field>
</x>
</query>
</iq>
]]></example>
<example caption="User Provides Registration Information With Group Name and Group Modify Fields"><![CDATA[
<iq type='set'
from='romeo@montague.lit/orchard'
to='msn.shakespeare.lit'
id='reg2'>
<query xmlns='jabber:iq:register'>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE'>
<value>jabber:iq:register</value>
</field>
<field var='username'>
<value>RomeoMyRomeo</value>
</field>
<field var='password'>
<value>ILoveJuliet</value>
</field>
<field var='groupmodifier'>
<value>(MSN Home)</value>
</field>
<field var='groupmodifylocation'>
<value>suffix</value>
</field>
</x>
</query>
</iq>
]]></example>
<p>When the gateway sends roster items to the user, it SHOULD then include the group name from the legacy service, prepended or appended with the groupmodify value.</p>
<example caption='Suggesting Addition of a Roster Item'><![CDATA[
<message from='msn.shakespeare.lit' to='romeo@montague.lit'>
<x xmlns='http://jabber.org/protocol/rosterx'>
<item action='add' jid='CapuletNurse@msn.shakespeare.lit'>
<group>Servants (MSN Home)</group>
</item>
</x>
</message>
]]></example>
</section2>
</section1>
<section1 topic='Business Rules' anchor='bizrules'>
<p>The following business rules apply:</p>
@ -1024,6 +1149,32 @@
<section2 topic='Protocol Namespaces' anchor='registrar-ns'>
<p>The &REGISTRAR; includes 'jabber:iq:gateway' in its registry of protocol namespaces.</p>
</section2>
<section2 topic='Field Standardization' anchor='registrar-formtypes'>
<p>The following fields shall be added to the "jabber:iq:register" FORM_TYPE originally created per <cite>XEP-0077</cite>.</p>
<code><![CDATA[
<form_type>
<name>jabber:iq:register</name>
<field
var='groupmodifier'
type='text-single'
label='The text that shall modify legacy service group names'/>
<field label='Location of Roster Group Modifier'
type='list-single'
var='groupmodifylocation'>
<option label='Prefix'>
<value>prefix</value>
</option>
<option label='Suffix'>
<value>suffix</value>
</option>
</field>
<field
var='groupname'
type='text-single'
label='The group name for roster item exchanges'/>
</form_type>
]]></code>
</section2>
</section1>
<section1 topic='XML Schema' anchor='schema'>
<code><![CDATA[