<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jul 25, 2014 at 10:06 AM, Georg Lukas <span dir="ltr"><<a href="mailto:georg@op-co.de" target="_blank">georg@op-co.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


Hi,<br>
<br>
XEP-0045, section 7.4 <<a href="http://xmpp.org/extensions/xep-0045.html#message" target="_blank">http://xmpp.org/extensions/xep-0045.html#message</a>><br>
states:<br>
<br>
"Note well that for tracking purposes this service assigns a new 'id' to<br>
each message it generates (here using a UUID as defined in RFC 4122 [18])."<br></blockquote><div><br></div><div>Prosody's MUC service doesn't do that. Broadcasted messages have the same 'id' as the original (including a missing 'id' attribute).</div>


<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I suggest changing that line to:<br>
<br>
"The service SHOULD reflect the message with the same 'id' that was<br>
generated by the client. If the client did not provide an 'id', the<br>
server SHOULD generate one 'id' and use it for all reflections of the<br>
same message (e.g. using a UUID as defined in RFC 4122 [18])."<br></blockquote><div><br></div><div>I object to the second SHOULD. Comments on the rest of the message follow.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">



(The example XML above should be changed accordingly; we might even<br>
replace SHOULD with MUST after the major implementations have changed)<br>
<br>
Rationale:<br>
<br>
A client needs some way to track if a sent message was succesfully<br>
processed and reflected. This is required to indicate success of<br>
transmission, to allow for message correction (XEP-0308), and it helps<br>
in displaying message errors in the context of the outgoing message.<br>
<br>
To determine if a newly received MUC message was indeed the reflection<br>
of the last outgoing MUC message, in theory three elements can be used:<br>
from, id, and body.<br>
<br>
 * from: the message 'from' attribute must be the participant's<br>
   nickname, however this will also be the case if the participant<br>
   is connected with two clients sharing the same nickname, and the<br>
   other client sends a MUC message.<br>
<br>
 * id: the message 'id' attribute can only be relied upon if the server<br>
   does not rewrite it<br>
<br>
 * body: the message body could be used to check if an incoming message<br>
   is the reflection of the just-sent message. However, some services<br>
   rewrite the body, i.e. to replace a large message with a pastebin<br>
   link.<br>
<br>
Therefore, none of the three elements can be reliably used to identify<br>
if an incoming MUC message is the reflection of the last outgoing<br>
message. To improve the situation, I suggest changing the XEP in a way<br>
that MUC message reflections keep the original message 'id'.<br>
<br>
Implications:<br>
<br>
This change might violate the uniqueness guarantee of message 'id's,<br>
however as the current behavior is not a MUST, service implementations<br>
exist that do not touch the message 'id', and the world is not falling<br>
apart.<br></blockquote><div><br></div><div>I'll note that there is no uniqueness guarantee in message 'id's. It's entirely up to the sender. I can happily make my client send id="waqas" for all messages forever, and that does not violate the spec. Given a lack of uniqueness guarantees, a server should either be generating IDs for all messages, or it should be generating them for none. Mixed-mode ID generation doesn't make a lot of sense.</div>


<div><br></div><div>Using 'id' to match messages doesn't work well. Security issue: I can notice the 'id' on your messages, and can happily send messages with that 'id' to confuse your client. You don't own the value of the 'id'. If you are using this to sync history on reconnect, I can even temporarily take over your nick while you are disconnected, leaving your client with nothing to detect the sync marker being invalid.</div>


<div><br></div><div>Given the current text of the XEP, even if this change is accepted, you may not be compatible with existing servers out there, and there's no way to reliably check for compatibility until after you've sent some messages.</div>


<div><br></div><div>History sync is one area of XMPP that's terribly broken. All the popular XMPP protocols involving history (MUC, offline messages, PubSub, etc) have large gaps and race conditions, making reliable sync impossible. Heck many of the specs only work on the assumption of synchronised clocks. This is a separate email though.</div>


<div><br></div><div>--</div><div>Waqas Hussain</div><div><br></div></div></div></div>