3 local lxp = require "lxp" |
3 local lxp = require "lxp" |
4 local init_xmlhandlers = require "core.xmlhandlers" |
4 local init_xmlhandlers = require "core.xmlhandlers" |
5 local sm_new_session = require "core.sessionmanager".new_session; |
5 local sm_new_session = require "core.sessionmanager".new_session; |
6 local s2s_new_incoming = require "core.s2smanager".new_incoming; |
6 local s2s_new_incoming = require "core.s2smanager".new_incoming; |
7 local s2s_streamopened = require "core.s2smanager".streamopened; |
7 local s2s_streamopened = require "core.s2smanager".streamopened; |
|
8 local s2s_streamclosed = require "core.s2smanager".streamopened; |
8 local s2s_destroy_session = require "core.s2smanager".destroy_session; |
9 local s2s_destroy_session = require "core.s2smanager".destroy_session; |
|
10 |
|
11 local stream_callbacks = { streamopened = s2s_streamopened, streamclosed = s2s_streamclosed }; |
9 |
12 |
10 local connlisteners_register = require "net.connlisteners".register; |
13 local connlisteners_register = require "net.connlisteners".register; |
11 |
14 |
12 local t_insert = table.insert; |
15 local t_insert = table.insert; |
13 local t_concat = table.concat; |
16 local t_concat = table.concat; |
22 |
25 |
23 -- These are session methods -- |
26 -- These are session methods -- |
24 |
27 |
25 local function session_reset_stream(session) |
28 local function session_reset_stream(session) |
26 -- Reset stream |
29 -- Reset stream |
27 local parser = lxp.new(init_xmlhandlers(session, s2s_streamopened), "|"); |
30 local parser = lxp.new(init_xmlhandlers(session, stream_callbacks), "|"); |
28 session.parser = parser; |
31 session.parser = parser; |
29 |
32 |
30 session.notopen = true; |
33 session.notopen = true; |
31 |
34 |
32 function session.data(conn, data) |
35 function session.data(conn, data) |
41 local log = session.log or log; |
44 local log = session.log or log; |
42 if session.conn then |
45 if session.conn then |
43 if reason then |
46 if reason then |
44 if type(reason) == "string" then -- assume stream error |
47 if type(reason) == "string" then -- assume stream error |
45 log("info", "Disconnecting %s[%s], <stream:error> is: %s", session.host or "(unknown host)", session.type, reason); |
48 log("info", "Disconnecting %s[%s], <stream:error> is: %s", session.host or "(unknown host)", session.type, reason); |
46 session.send(st.stanza("stream:error"):tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' })); |
49 session.sends2s(st.stanza("stream:error"):tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' })); |
47 elseif type(reason) == "table" then |
50 elseif type(reason) == "table" then |
48 if reason.condition then |
51 if reason.condition then |
49 local stanza = st.stanza("stream:error"):tag(reason.condition, stream_xmlns_attr):up(); |
52 local stanza = st.stanza("stream:error"):tag(reason.condition, stream_xmlns_attr):up(); |
50 if reason.text then |
53 if reason.text then |
51 stanza:tag("text", stream_xmlns_attr):text(reason.text):up(); |
54 stanza:tag("text", stream_xmlns_attr):text(reason.text):up(); |
52 end |
55 end |
53 if reason.extra then |
56 if reason.extra then |
54 stanza:add_child(reason.extra); |
57 stanza:add_child(reason.extra); |
55 end |
58 end |
56 log("info", "Disconnecting %s[%s], <stream:error> is: %s", session.host or "(unknown host)", session.type, tostring(stanza)); |
59 log("info", "Disconnecting %s[%s], <stream:error> is: %s", session.host or "(unknown host)", session.type, tostring(stanza)); |
57 session.send(stanza); |
60 session.sends2s(stanza); |
58 elseif reason.name then -- a stanza |
61 elseif reason.name then -- a stanza |
59 log("info", "Disconnecting %s[%s], <stream:error> is: %s", session.host or "(unknown host)", session.type, tostring(reason)); |
62 log("info", "Disconnecting %s->%s[%s], <stream:error> is: %s", session.from_host or "(unknown host)", session.to_host or "(unknown host)", session.type, tostring(reason)); |
60 session.send(reason); |
63 session.sends2s(reason); |
61 end |
64 end |
62 end |
65 end |
63 end |
66 end |
64 session.send("</stream:stream>"); |
67 session.sends2s("</stream:stream>"); |
65 session.conn.close(); |
68 session.conn.close(); |
66 xmppserver.disconnect(session.conn, "stream error"); |
69 xmppserver.disconnect(session.conn, "stream error"); |
67 end |
70 end |
68 end |
71 end |
69 |
72 |
98 -- (I'm on a mission, no time to fix now) |
101 -- (I'm on a mission, no time to fix now) |
99 |
102 |
100 -- Debug version -- |
103 -- Debug version -- |
101 local function handleerr(err) print("Traceback:", err, debug.traceback()); end |
104 local function handleerr(err) print("Traceback:", err, debug.traceback()); end |
102 session.stanza_dispatch = function (stanza) return select(2, xpcall(function () return core_process_stanza(session, stanza); end, handleerr)); end |
105 session.stanza_dispatch = function (stanza) return select(2, xpcall(function () return core_process_stanza(session, stanza); end, handleerr)); end |
103 |
|
104 -- session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end |
|
105 |
|
106 end |
106 end |
107 if data then |
107 if data then |
108 session.data(conn, data); |
108 session.data(conn, data); |
109 end |
109 end |
110 end |
110 end |