plugins/mod_s2s/mod_s2s.lua
changeset 9415 063977461363
parent 9073 21730a3642fe
child 9452 94033a2529b9
equal deleted inserted replaced
9414:62c876e333e4 9415:063977461363
   117 				stanza.attr.type ~= "error" and stanza.attr.type ~= "result" and st.reply(stanza);
   117 				stanza.attr.type ~= "error" and stanza.attr.type ~= "result" and st.reply(stanza);
   118 			};
   118 			};
   119 			if host.sendq then
   119 			if host.sendq then
   120 				t_insert(host.sendq, queued_item);
   120 				t_insert(host.sendq, queued_item);
   121 			else
   121 			else
       
   122 				-- luacheck: ignore 122
   122 				host.sendq = { queued_item };
   123 				host.sendq = { queued_item };
   123 			end
   124 			end
   124 			host.log("debug", "stanza [%s] queued ", stanza.name);
   125 			host.log("debug", "stanza [%s] queued ", stanza.name);
   125 			return true;
   126 			return true;
   126 		elseif host.type == "local" or host.type == "component" then
   127 		elseif host.type == "local" or host.type == "component" then
   173 	end
   174 	end
   174 	module:hook("route/remote", route_to_existing_session, -1);
   175 	module:hook("route/remote", route_to_existing_session, -1);
   175 	module:hook("route/remote", route_to_new_session, -10);
   176 	module:hook("route/remote", route_to_new_session, -10);
   176 	module:hook("s2s-authenticated", make_authenticated, -1);
   177 	module:hook("s2s-authenticated", make_authenticated, -1);
   177 	module:hook("s2s-read-timeout", keepalive, -1);
   178 	module:hook("s2s-read-timeout", keepalive, -1);
   178 	module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza)
   179 	module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza) -- luacheck: ignore 212/stanza
   179 		if session.type == "s2sout" then
   180 		if session.type == "s2sout" then
   180 			-- Stream is authenticated and we are seem to be done with feature negotiation,
   181 			-- Stream is authenticated and we are seem to be done with feature negotiation,
   181 			-- so the stream is ready for stanzas.  RFC 6120 Section 4.3
   182 			-- so the stream is ready for stanzas.  RFC 6120 Section 4.3
   182 			mark_connected(session);
   183 			mark_connected(session);
   183 			return true;
   184 			return true;
   495 						stanza:tag("text", stream_xmlns_attr):text(reason.text):up();
   496 						stanza:tag("text", stream_xmlns_attr):text(reason.text):up();
   496 					end
   497 					end
   497 					if reason.extra then
   498 					if reason.extra then
   498 						stanza:add_child(reason.extra);
   499 						stanza:add_child(reason.extra);
   499 					end
   500 					end
   500 					log("debug", "Disconnecting %s[%s], <stream:error> is: %s", session.host or session.ip or "(unknown host)", session.type, stanza);
   501 					log("debug", "Disconnecting %s[%s], <stream:error> is: %s",
       
   502 					session.host or session.ip or "(unknown host)", session.type, stanza);
   501 					session.sends2s(stanza);
   503 					session.sends2s(stanza);
   502 				elseif reason.name then -- a stanza
   504 				elseif reason.name then -- a stanza
   503 					log("debug", "Disconnecting %s->%s[%s], <stream:error> is: %s", session.from_host or "(unknown host)", session.to_host or "(unknown host)", session.type, reason);
   505 					log("debug", "Disconnecting %s->%s[%s], <stream:error> is: %s",
       
   506 						session.from_host or "(unknown host)", session.to_host or "(unknown host)",
       
   507 						session.type, reason);
   504 					session.sends2s(reason);
   508 					session.sends2s(reason);
   505 				end
   509 				end
   506 			end
   510 			end
   507 		end
   511 		end
   508 
   512 
   509 		session.sends2s("</stream:stream>");
   513 		session.sends2s("</stream:stream>");
   510 		function session.sends2s() return false; end
   514 		function session.sends2s() return false; end
   511 
   515 
       
   516 		-- luacheck: ignore 422/reason
       
   517 		-- FIXME reason should be managed in a place common to c2s, s2s, bosh, component etc
   512 		local reason = remote_reason or (reason and (reason.text or reason.condition)) or reason;
   518 		local reason = remote_reason or (reason and (reason.text or reason.condition)) or reason;
   513 		session.log("info", "%s s2s stream %s->%s closed: %s", session.direction:gsub("^.", string.upper), session.from_host or "(unknown host)", session.to_host or "(unknown host)", reason or "stream closed");
   519 		session.log("info", "%s s2s stream %s->%s closed: %s", session.direction:gsub("^.", string.upper),
       
   520 			session.from_host or "(unknown host)", session.to_host or "(unknown host)", reason or "stream closed");
   514 
   521 
   515 		-- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote
   522 		-- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote
   516 		local conn = session.conn;
   523 		local conn = session.conn;
   517 		if reason == nil and not session.notopen and session.type == "s2sin" then
   524 		if reason == nil and not session.notopen and session.type == "s2sin" then
   518 			add_task(stream_close_timeout, function ()
   525 			add_task(stream_close_timeout, function ()
   527 			conn:close(); -- Close immediately, as this is an outgoing connection or is not authed
   534 			conn:close(); -- Close immediately, as this is an outgoing connection or is not authed
   528 		end
   535 		end
   529 	end
   536 	end
   530 end
   537 end
   531 
   538 
   532 function session_stream_attrs(session, from, to, attr)
   539 function session_stream_attrs(session, from, to, attr) -- luacheck: ignore 212/session
   533 	if not from or (hosts[from] and hosts[from].modules.dialback) then
   540 	if not from or (hosts[from] and hosts[from].modules.dialback) then
   534 		attr["xmlns:db"] = 'jabber:server:dialback';
   541 		attr["xmlns:db"] = 'jabber:server:dialback';
   535 	end
   542 	end
   536 	if not from then
   543 	if not from then
   537 		attr.from = '';
   544 		attr.from = '';
   595 	end
   602 	end
   596 
   603 
   597 	session.close = session_close;
   604 	session.close = session_close;
   598 
   605 
   599 	local handlestanza = stream_callbacks.handlestanza;
   606 	local handlestanza = stream_callbacks.handlestanza;
   600 	function session.dispatch_stanza(session, stanza)
   607 	function session.dispatch_stanza(session, stanza) -- luacheck: ignore 432/session
   601 		return handlestanza(session, stanza);
   608 		return handlestanza(session, stanza);
   602 	end
   609 	end
   603 
   610 
   604 	module:fire_event("s2s-created", { session = session });
   611 	module:fire_event("s2s-created", { session = session });
   605 
   612