core/stanza_router.lua

changeset 2949
ef19faa7d106
parent 2923
b7049746bd29
child 2951
294c359a05f5
equal deleted inserted replaced
2932:d2816fb6c7ea 2949:ef19faa7d106
21 local bare_sessions = _G.prosody.bare_sessions; 21 local bare_sessions = _G.prosody.bare_sessions;
22 22
23 function core_process_stanza(origin, stanza) 23 function core_process_stanza(origin, stanza)
24 (origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag()) 24 (origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag())
25 25
26 -- Currently we guarantee every stanza to have an xmlns, should we keep this rule?
27 if not stanza.attr.xmlns then stanza.attr.xmlns = "jabber:client"; end
28
29 -- TODO verify validity of stanza (as well as JID validity) 26 -- TODO verify validity of stanza (as well as JID validity)
30 if stanza.attr.type == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log 27 if stanza.attr.type == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log
31 if stanza.name == "iq" then 28 if stanza.name == "iq" then
32 if not stanza.attr.id then stanza.attr.id = ""; end -- COMPAT Jabiru doesn't send the id attribute on roster requests 29 if not stanza.attr.id then stanza.attr.id = ""; end -- COMPAT Jabiru doesn't send the id attribute on roster requests
33 if (stanza.attr.type == "set" or stanza.attr.type == "get") and (#stanza.tags ~= 1) then 30 if (stanza.attr.type == "set" or stanza.attr.type == "get") and (#stanza.tags ~= 1) then
34 origin.send(st.error_reply(stanza, "modify", "bad-request")); 31 origin.send(st.error_reply(stanza, "modify", "bad-request"));
35 return; 32 return;
36 end 33 end
37 end 34 end
38 35
39 if origin.type == "c2s" and stanza.attr.xmlns == "jabber:client" then 36 if origin.type == "c2s" and not stanza.attr.xmlns then
40 if not origin.full_jid 37 if not origin.full_jid
41 and not(stanza.name == "iq" and stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "bind" 38 and not(stanza.name == "iq" and stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "bind"
42 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then 39 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
43 -- authenticated client isn't bound and current stanza is not a bind request 40 -- authenticated client isn't bound and current stanza is not a bind request
44 if stanza.attr.type ~= "result" and stanza.attr.type ~= "error" then 41 if stanza.attr.type ~= "result" and stanza.attr.type ~= "error" then
90 --[[if to and not(hosts[to]) and not(hosts[to_bare]) and (hosts[host] and hosts[host].type ~= "local") then -- not for us? 87 --[[if to and not(hosts[to]) and not(hosts[to_bare]) and (hosts[host] and hosts[host].type ~= "local") then -- not for us?
91 log("warn", "stanza recieved for a non-local server"); 88 log("warn", "stanza recieved for a non-local server");
92 return; -- FIXME what should we do here? 89 return; -- FIXME what should we do here?
93 end]] -- FIXME 90 end]] -- FIXME
94 91
95 if (origin.type == "s2sin" or origin.type == "c2s" or origin.type == "component") and xmlns == "jabber:client" then 92 if (origin.type == "s2sin" or origin.type == "c2s" or origin.type == "component") and xmlns == nil then
96 if origin.type == "s2sin" and not origin.dummy then 93 if origin.type == "s2sin" and not origin.dummy then
97 local host_status = origin.hosts[from_host]; 94 local host_status = origin.hosts[from_host];
98 if not host_status or not host_status.authed then -- remote server trying to impersonate some other server? 95 if not host_status or not host_status.authed then -- remote server trying to impersonate some other server?
99 log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host); 96 log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host);
100 return; -- FIXME what should we do here? does this work with subdomains? 97 return; -- FIXME what should we do here? does this work with subdomains?
103 core_post_stanza(origin, stanza, origin.full_jid); 100 core_post_stanza(origin, stanza, origin.full_jid);
104 else 101 else
105 local h = hosts[stanza.attr.to or origin.host or origin.to_host]; 102 local h = hosts[stanza.attr.to or origin.host or origin.to_host];
106 if h then 103 if h then
107 local event; 104 local event;
108 if stanza.attr.xmlns == "jabber:client" then 105 if xmlns == nil then
109 if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get") then 106 if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get") then
110 event = "stanza/iq/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name; 107 event = "stanza/iq/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name;
111 else 108 else
112 event = "stanza/"..stanza.name; 109 event = "stanza/"..stanza.name;
113 end 110 end
114 else 111 else
115 event = "stanza/"..stanza.attr.xmlns..":"..stanza.name; 112 event = "stanza/"..xmlns..":"..stanza.name;
116 end 113 end
117 if h.events.fire_event(event, {origin = origin, stanza = stanza}) then return; end 114 if h.events.fire_event(event, {origin = origin, stanza = stanza}) then return; end
118 end 115 end
119 if host and not hosts[host] then host = nil; end -- COMPAT: workaround for a Pidgin bug which sets 'to' to the SRV result 116 if host and not hosts[host] then host = nil; end -- COMPAT: workaround for a Pidgin bug which sets 'to' to the SRV result
120 modules_handle_stanza(host or origin.host or origin.to_host, origin, stanza); 117 modules_handle_stanza(host or origin.host or origin.to_host, origin, stanza);

mercurial