Software /
code /
prosody
Comparison
net/xmppserver_listener.lua @ 331:830fd67f9378
Quite some changes, to:
- Small logging fix for s2smanager
- Send a stream error if an incoming s2s connection is to an unrecognised hostname (fixes #11)
- init_xmlhandlers now takes a table of callbacks (includes changes to net/xmpp*_listener for this)
- Move sending of unavailable presence to where it should be, sessionmanager.destroy_session
- Fix sending of stream errors to wrong connection
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 18 Nov 2008 17:52:33 +0000 |
parent | 330:d9d4c1de16ce |
child | 333:8d15b073fdbe |
comparison
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 |