Mercurial > prosody-modules
comparison mod_smacks/mod_smacks.lua @ 2623:a65260300708
mod_smacks: Made module more error resistant
| author | tmolitor <thilo@eightysoft.de> |
|---|---|
| date | Wed, 15 Mar 2017 16:21:55 +0100 |
| parents | 362ca94192ee |
| children | c110b6bfe5d1 |
comparison
equal
deleted
inserted
replaced
| 2622:ac3ca6233ded | 2623:a65260300708 |
|---|---|
| 211 session_registry.set(session.username, session.resumption_token, nil); | 211 session_registry.set(session.username, session.resumption_token, nil); |
| 212 old_session_registry.set(session.username, session.resumption_token, nil); | 212 old_session_registry.set(session.username, session.resumption_token, nil); |
| 213 session.resumption_token = nil; | 213 session.resumption_token = nil; |
| 214 end | 214 end |
| 215 -- send out last ack as per revision 1.5.2 of XEP-0198 | 215 -- send out last ack as per revision 1.5.2 of XEP-0198 |
| 216 if session.smacks then | 216 if session.smacks and session.conn then |
| 217 (session.sends2s or session.send)(st.stanza("a", { xmlns = session.smacks, h = tostring(session.handled_stanza_count) })); | 217 (session.sends2s or session.send)(st.stanza("a", { xmlns = session.smacks, h = tostring(session.handled_stanza_count) })); |
| 218 end | 218 end |
| 219 return session_close(...); | 219 return session_close(...); |
| 220 end | 220 end |
| 221 return session; | 221 return session; |
| 407 session.log("debug", "Session resumed before hibernation timeout, all is well") | 407 session.log("debug", "Session resumed before hibernation timeout, all is well") |
| 408 end | 408 end |
| 409 end); | 409 end); |
| 410 return true; -- Postpone destruction for now | 410 return true; -- Postpone destruction for now |
| 411 end | 411 end |
| 412 | |
| 413 end | 412 end |
| 414 end); | 413 end); |
| 415 | 414 |
| 416 local function handle_s2s_destroyed(event) | 415 local function handle_s2s_destroyed(event) |
| 417 local session = event.session; | 416 local session = event.session; |
| 468 conn:close(); | 467 conn:close(); |
| 469 end | 468 end |
| 470 original_session.ip = session.ip; | 469 original_session.ip = session.ip; |
| 471 original_session.conn = session.conn; | 470 original_session.conn = session.conn; |
| 472 original_session.send = session.send; | 471 original_session.send = session.send; |
| 472 original_session.close = session.close; | |
| 473 original_session.filter = session.filter; | 473 original_session.filter = session.filter; |
| 474 original_session.filter.session = original_session; | 474 original_session.filter.session = original_session; |
| 475 original_session.filters = session.filters; | 475 original_session.filters = session.filters; |
| 476 original_session.stream = session.stream; | 476 original_session.stream = session.stream; |
| 477 original_session.secure = session.secure; | 477 original_session.secure = session.secure; |
| 480 -- Inform xmppstream of the new session (passed to its callbacks) | 480 -- Inform xmppstream of the new session (passed to its callbacks) |
| 481 original_session.stream:set_session(original_session); | 481 original_session.stream:set_session(original_session); |
| 482 -- Similar for connlisteners | 482 -- Similar for connlisteners |
| 483 c2s_sessions[session.conn] = original_session; | 483 c2s_sessions[session.conn] = original_session; |
| 484 | 484 |
| 485 session.send(st.stanza("resumed", { xmlns = xmlns_sm, | 485 original_session.send(st.stanza("resumed", { xmlns = xmlns_sm, |
| 486 h = original_session.handled_stanza_count, previd = id })); | 486 h = original_session.handled_stanza_count, previd = id })); |
| 487 | 487 |
| 488 -- Fake an <a> with the h of the <resume/> from the client | 488 -- Fake an <a> with the h of the <resume/> from the client |
| 489 original_session:dispatch_stanza(st.stanza("a", { xmlns = xmlns_sm, | 489 original_session:dispatch_stanza(st.stanza("a", { xmlns = xmlns_sm, |
| 490 h = stanza.attr.h })); | 490 h = stanza.attr.h })); |
| 491 | 491 |
| 492 -- Ok, we need to re-send any stanzas that the client didn't see | 492 -- Ok, we need to re-send any stanzas that the client didn't see |
| 493 -- ...they are what is now left in the outgoing stanza queue | 493 -- ...they are what is now left in the outgoing stanza queue |
| 494 local queue = original_session.outgoing_stanza_queue; | 494 local queue = original_session.outgoing_stanza_queue; |
| 495 module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue}); | 495 module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue}); |
| 496 session.log("debug", "#queue = %d", #queue); | 496 original_session.log("debug", "#queue = %d", #queue); |
| 497 for i=1,#queue do | 497 for i=1,#queue do |
| 498 session.send(queue[i]); | 498 original_session.send(queue[i]); |
| 499 end | 499 end |
| 500 session.log("debug", "#queue = %d -- after send", #queue); | 500 original_session.log("debug", "#queue = %d -- after send", #queue); |
| 501 function session.send(stanza) | |
| 502 session.log("warn", "Tried to send stanza on old session migrated by smacks resume (maybe there is a bug?): %s", tostring(stanza)); | |
| 503 return false; | |
| 504 end | |
| 501 else | 505 else |
| 502 module:log("warn", "Client %s@%s[%s] tried to resume stream for %s@%s[%s]", | 506 module:log("warn", "Client %s@%s[%s] tried to resume stream for %s@%s[%s]", |
| 503 session.username or "?", session.host or "?", session.type, | 507 session.username or "?", session.host or "?", session.type, |
| 504 original_session.username or "?", original_session.host or "?", original_session.type); | 508 original_session.username or "?", original_session.host or "?", original_session.type); |
| 505 session.send(st.stanza("failed", { xmlns = xmlns_sm }) | 509 session.send(st.stanza("failed", { xmlns = xmlns_sm }) |
