Comparison

plugins/mod_c2s.lua @ 6005:98b768a41c9d

mod_c2s: Break out stream opening into a separate function
author Florian Zeitz <florob@babelmonkeys.de>
date Fri, 31 Jan 2014 12:01:12 +0100
parent 5859:e327f2d4e09f
child 6063:e626ee2fe106
comparison
equal deleted inserted replaced
6004:09151d26560a 6005:98b768a41c9d
36 local listener = {}; 36 local listener = {};
37 local runner_callbacks = {}; 37 local runner_callbacks = {};
38 38
39 --- Stream events handlers 39 --- Stream events handlers
40 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'}; 40 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'};
41 local default_stream_attr = { ["xmlns:stream"] = "http://etherx.jabber.org/streams", xmlns = stream_callbacks.default_ns, version = "1.0", id = "" };
42 41
43 function stream_callbacks.streamopened(session, attr) 42 function stream_callbacks.streamopened(session, attr)
44 local send = session.send; 43 local send = session.send;
45 session.host = nameprep(attr.to); 44 session.host = nameprep(attr.to);
46 if not session.host then 45 if not session.host then
56 -- We don't serve this host... 55 -- We don't serve this host...
57 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; 56 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)};
58 return; 57 return;
59 end 58 end
60 59
61 send("<?xml version='1.0'?>"..st.stanza("stream:stream", { 60 session:open_stream();
62 xmlns = 'jabber:client', ["xmlns:stream"] = 'http://etherx.jabber.org/streams';
63 id = session.streamid, from = session.host, version = '1.0', ["xml:lang"] = 'en' }):top_tag());
64 61
65 (session.log or log)("debug", "Sent reply <stream:stream> to client"); 62 (session.log or log)("debug", "Sent reply <stream:stream> to client");
66 session.notopen = nil; 63 session.notopen = nil;
67 64
68 -- If session.secure is *false* (not nil) then it means we /were/ encrypting 65 -- If session.secure is *false* (not nil) then it means we /were/ encrypting
127 --- Session methods 124 --- Session methods
128 local function session_close(session, reason) 125 local function session_close(session, reason)
129 local log = session.log or log; 126 local log = session.log or log;
130 if session.conn then 127 if session.conn then
131 if session.notopen then 128 if session.notopen then
132 session.send("<?xml version='1.0'?>"); 129 session:open_stream();
133 session.send(st.stanza("stream:stream", default_stream_attr):top_tag());
134 end 130 end
135 if reason then -- nil == no err, initiated by us, false == initiated by client 131 if reason then -- nil == no err, initiated by us, false == initiated by client
136 local stream_error = st.stanza("stream:error"); 132 local stream_error = st.stanza("stream:error");
137 if type(reason) == "string" then -- assume stream error 133 if type(reason) == "string" then -- assume stream error
138 stream_error:tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' }); 134 stream_error:tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' });
176 conn:close(); 172 conn:close();
177 end 173 end
178 end 174 end
179 end 175 end
180 176
177 local function session_open_stream(session)
178 local attr = {
179 ["xmlns:stream"] = 'http://etherx.jabber.org/streams',
180 xmlns = stream_callbacks.default_ns,
181 version = "1.0",
182 ["xml:lang"] = 'en',
183 id = session.streamid or "",
184 from = session.host
185 };
186 session.send("<?xml version='1.0'?>");
187 session.send(st.stanza("stream:stream", attr):top_tag());
188 end
189
181 module:hook_global("user-deleted", function(event) 190 module:hook_global("user-deleted", function(event)
182 local username, host = event.username, event.host; 191 local username, host = event.username, event.host;
183 local user = hosts[host].sessions[username]; 192 local user = hosts[host].sessions[username];
184 if user and user.sessions then 193 if user and user.sessions then
185 for jid, session in pairs(user.sessions) do 194 for jid, session in pairs(user.sessions) do
223 232
224 if opt_keepalives then 233 if opt_keepalives then
225 conn:setoption("keepalive", opt_keepalives); 234 conn:setoption("keepalive", opt_keepalives);
226 end 235 end
227 236
237 session.open_stream = session_open_stream;
228 session.close = session_close; 238 session.close = session_close;
229 239
230 local stream = new_xmpp_stream(session, stream_callbacks); 240 local stream = new_xmpp_stream(session, stream_callbacks);
231 session.stream = stream; 241 session.stream = stream;
232 session.notopen = true; 242 session.notopen = true;