Thanks for the information, too.<br>Now all we can do is to make the client as fault-tolerant as possible :) <br><br><div><span class="gmail_quote">On 19/06/07, <b class="gmail_sendername">Sylvain Hellegouarch</b> &lt;<a href="mailto:sh@defuze.org">
sh@defuze.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thanks for this summary because I&#39;ve been reading these sections of RFC
<br>3921 *a lot* and there are so many different combinations that I lose it<br>quickly.<br><br>/me pokes psa too. A diagram of all the different interactions would go<br>a long way /me thinks<br><br>- Sylvain<br><br>Mridul Muralidharan a écrit :
<br>&gt;<br>&gt; Hi,<br>&gt;<br>&gt;&nbsp;&nbsp; I think Peter is in the process of clarifying the bis spec on the<br>&gt; subscription appendix&#39;s. /me pokes psa :)<br>&gt; It might be a good idea to wait for that to be complete ... currently,
<br>&gt; the state of specs is a bit icky from an impl point of view (though<br>&gt; well defined).<br>&gt;<br>&gt; Roughly, 3921 says these :<br>&gt;<br>&gt; - a user can add any contact to his roster, this does not trigger a
<br>&gt; presence subscription request - but a roster push(*) will occur.<br>&gt;<br>&gt; - a user can ask for subscription to contact : (if contact is not in<br>&gt; the user&#39;s roster (step 1 omitted), it gets automatically added) this
<br>&gt; triggers a roster push(*) with change in subscription status (ask<br>&gt; attribute).<br>&gt;<br>&gt; - if contact is online, subscribe is pushed to all available resources<br>&gt; using rules similar to roster push(*).
<br>&gt;<br>&gt; - if contact is offline or no resource is available which satisfies<br>&gt; rule for roster push(*), this is stored for later delivery.<br>&gt;<br>&gt; - if contact rejects subscription (unsubscribed), this triggers a
<br>&gt; roster update in user&#39;s roster appropriately (must not result in<br>&gt; removal of entry - I see that some servers remove the contact&#39;s jid<br>&gt; from user roster) and a corresponding roster push(*).<br>
&gt;<br>&gt; - 3921 says that the unsubscribed must be delivered to the user&#39;s<br>&gt; resources(*).<br>&gt;<br>&gt; (*) The roster push above will happen only to all resources which have<br>&gt; requested (or modified) roster in some way (including asking for
<br>&gt; subscription).<br>&gt;<br>&gt; Similar steps above when contact&#39;s approves subscription.<br>&gt;<br>&gt; The state table related to inbound unsubscribe, unsubscribed and<br>&gt; subscribed could be changed for 3921 bis spec (it has already been
<br>&gt; changed for subscribed). If I am not wrong, the last step above would<br>&gt; not happen - that is, unsubscribe(d) will not be routed to the user.<br>&gt;<br>&gt; Here, I assumed that there is no subscription between user &amp; contact,
<br>&gt; if that is present, it just adds more to the flow - refer to section 9<br>&gt; in 3921 [1]<br>&gt;<br>&gt; Hope this clarifies. The steps above are the same irrespective of<br>&gt; whether it is a local contact, s2s contact, clustered configuration or
<br>&gt; other combinations.<br>&gt;<br>&gt; Regards,<br>&gt; Mridul<br>&gt;<br>&gt; [1] <a href="http://www.xmpp.org/rfcs/rfc3921.html#substates">http://www.xmpp.org/rfcs/rfc3921.html#substates</a><br>&gt;<br>&gt; Tran Thai Son wrote:
<br>&gt;&gt; Hi all,<br>&gt;&gt;<br>&gt;&gt; I am writing a client and I&#39;ve experienced different behaviors from<br>&gt;&gt; different servers in handling client&#39;s actions such as add / accept /<br>&gt;&gt; deny subscription requests. What surprised me is that it seems there
<br>&gt;&gt; is no standard behaviors ( e.g. processes of treating actions, order<br>&gt;&gt; of notification messages pushing to the clients...) for the server.<br>&gt;&gt;<br>&gt;&gt; E.g.:<br>&gt;&gt; - ejabbered 1.1.3
 always adds the incoming contact to the user&#39;s<br>&gt;&gt; roster (with the subscription status = 0, means no relationship)<br>&gt;&gt; before pushing the subscription (add-friend) request to the user. So<br>&gt;&gt; the client gets two messages: one to notify that there is an item
<br>&gt;&gt; added, the next to notify that there is a subscription request.<br>&gt;&gt; - meanwhile, openFire 3.3.1 does not add the contact before, so you<br>&gt;&gt; get only the later message. One (probably) bug I found: even when the
<br>&gt;&gt; client sent a message denying the subscription request, the server<br>&gt;&gt; still adds the contact to the user&#39;s roster (with subscription= 0)<br>&gt;&gt;<br>&gt;&gt; Furthermore, with the same actions from the clients, the number&nbsp;&nbsp;and
<br>&gt;&gt; order of messages that the servers send significantly different.<br>&gt;&gt; E.g.<br>&gt;&gt; - ejabbered 1.1.3 tends to not to send any message to the contact<br>&gt;&gt; with subscription = 0. Example: If user B denied a subscription
<br>&gt;&gt; request from user B (means no relationship at the moment), B will not<br>&gt;&gt; receive the next unsubscription request from A, but with openFire<br>&gt;&gt; 3.3.1, it will.<br>&gt;&gt; - Furthermore, I found the order of messages that openFire pushes to
<br>&gt;&gt; the clients rather annoying. For example, if user A removes user B<br>&gt;&gt; from its roster (and therefore B will also remove A - my<br>&gt;&gt; implementation), A will receive &quot;unsubscribed&quot; and &quot;unsubscribe&quot;
<br>&gt;&gt; (respectively) from B before received the notification that its<br>&gt;&gt; removal was done. So you cannot trust that: when you remove a contact<br>&gt;&gt; from your roster, you won&#39;t receive unexpected message from that
<br>&gt;&gt; contact; You also see that contact still in your roster for a while<br>&gt;&gt; (with subscription = 0).<br>&gt;&gt;<br>&gt;&gt; Does any body experience similar problems ?<br>&gt;&gt;<br>&gt;&gt; Son.<br>&gt;&gt;
<br>&gt;&gt;<br>&gt;&gt;<br><br></blockquote></div><br>