net/xmppserver_listener.lua

changeset 331
830fd67f9378
parent 330
d9d4c1de16ce
child 333
8d15b073fdbe
equal deleted inserted replaced
330:d9d4c1de16ce 331:830fd67f9378
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

mercurial