comparison mod_smacks/mod_smacks.lua @ 1324:853a382c9bd6

mod_turncredentials: Advertise the XEP-0215 feature (thanks Gryffus)
author Kim Alvefur <zash@zash.se>
date Fri, 28 Feb 2014 15:36:06 +0100
parents 659da45a2b4b
children b21236b6b8d8
comparison
equal deleted inserted replaced
1323:c84ff82658cb 1324:853a382c9bd6
6 local os_time = os.time; 6 local os_time = os.time;
7 local tonumber, tostring = tonumber, tostring; 7 local tonumber, tostring = tonumber, tostring;
8 local add_filter = require "util.filters".add_filter; 8 local add_filter = require "util.filters".add_filter;
9 local timer = require "util.timer"; 9 local timer = require "util.timer";
10 local datetime = require "util.datetime"; 10 local datetime = require "util.datetime";
11 local tb = require"util.debug".traceback;
11 12
12 local xmlns_sm2 = "urn:xmpp:sm:2"; 13 local xmlns_sm2 = "urn:xmpp:sm:2";
13 local xmlns_sm3 = "urn:xmpp:sm:3"; 14 local xmlns_sm3 = "urn:xmpp:sm:3";
14 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas"; 15 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas";
15 local xmlns_delay = "urn:xmpp:delay"; 16 local xmlns_delay = "urn:xmpp:delay";
82 83
83 local _send = session.sends2s or session.send; 84 local _send = session.sends2s or session.send;
84 local function new_send(stanza) 85 local function new_send(stanza)
85 local attr = stanza.attr; 86 local attr = stanza.attr;
86 if attr and not attr.xmlns then -- Stanza in default stream namespace 87 if attr and not attr.xmlns then -- Stanza in default stream namespace
88 session.log("debug", "Sending stanza %s", stanza:top_tag());
87 local cached_stanza = st.clone(stanza); 89 local cached_stanza = st.clone(stanza);
88 90
89 if cached_stanza and cached_stanza:get_child("delay", xmlns_delay) == nil then 91 if cached_stanza and cached_stanza:get_child("delay", xmlns_delay) == nil then
90 cached_stanza = cached_stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()}); 92 cached_stanza = cached_stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()});
91 end 93 end
92 94
93 queue[#queue+1] = cached_stanza; 95 queue[#queue+1] = cached_stanza;
96 session.log("debug", "#queue = %d", #queue);
94 end 97 end
95 if session.hibernating then 98 if session.hibernating then
99 session.log("debug", "hibernating, stanza queued")
96 -- The session is hibernating, no point in sending the stanza 100 -- The session is hibernating, no point in sending the stanza
97 -- over a dead connection. It will be delivered upon resumption. 101 -- over a dead connection. It will be delivered upon resumption.
98 return true; 102 return true;
99 end 103 end
100 local ok, err = _send(stanza); 104 local ok, err = _send(stanza);
202 end 206 end
203 end 207 end
204 for i=1,math_min(handled_stanza_count,#queue) do 208 for i=1,math_min(handled_stanza_count,#queue) do
205 t_remove(origin.outgoing_stanza_queue, 1); 209 t_remove(origin.outgoing_stanza_queue, 1);
206 end 210 end
211 origin.log("debug", "#queue = %d", #queue);
207 origin.last_acknowledged_stanza = origin.last_acknowledged_stanza + handled_stanza_count; 212 origin.last_acknowledged_stanza = origin.last_acknowledged_stanza + handled_stanza_count;
208 return true; 213 return true;
209 end 214 end
210 module:hook_stanza(xmlns_sm2, "a", handle_a); 215 module:hook_stanza(xmlns_sm2, "a", handle_a);
211 module:hook_stanza(xmlns_sm3, "a", handle_a); 216 module:hook_stanza(xmlns_sm3, "a", handle_a);
331 h = stanza.attr.h })); 336 h = stanza.attr.h }));
332 337
333 -- Ok, we need to re-send any stanzas that the client didn't see 338 -- Ok, we need to re-send any stanzas that the client didn't see
334 -- ...they are what is now left in the outgoing stanza queue 339 -- ...they are what is now left in the outgoing stanza queue
335 local queue = original_session.outgoing_stanza_queue; 340 local queue = original_session.outgoing_stanza_queue;
341 session.log("debug", "#queue = %d", #queue);
336 for i=1,#queue do 342 for i=1,#queue do
337 session.send(queue[i]); 343 session.send(queue[i]);
338 end 344 end
345 session.log("debug", "#queue = %d -- after send", #queue);
339 else 346 else
340 module:log("warn", "Client %s@%s[%s] tried to resume stream for %s@%s[%s]", 347 module:log("warn", "Client %s@%s[%s] tried to resume stream for %s@%s[%s]",
341 session.username or "?", session.host or "?", session.type, 348 session.username or "?", session.host or "?", session.type,
342 original_session.username or "?", original_session.host or "?", original_session.type); 349 original_session.username or "?", original_session.host or "?", original_session.type);
343 session.send(st.stanza("failed", { xmlns = xmlns_sm }) 350 session.send(st.stanza("failed", { xmlns = xmlns_sm })