From 96ded4535d30a703b03caae9e24f27f0cad25122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Sautret?= Date: Tue, 30 Oct 2007 17:38:40 +0000 Subject: [PATCH] * src/ejabberd_s2s.erl: don't use the resource of the sender to choose a s2s connection to ensure that a muc room always uses the same connection Merge branch 'ejabberd_s2s' Conflicts: .gitignore src/configure src/ejabberd_c2s.erl src/ejabberd_s2s.erl SVN Revision: 963 --- .gitignore | 6 +++ src/configure | 1 - src/ejabberd_c2s.erl | 17 ++++---- src/ejabberd_s2s.erl | 102 ++++++++++++++++++++++--------------------- 4 files changed, 66 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index c87d57d0d..8df1e60f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,12 @@ *.beam *~ *.so +*.flc +*.log +erl_crash.dump +ejabberd.cfg +ejabberd.sh +Mnesia.* Makefile XmppAddr.asn1db XmppAddr.erl diff --git a/src/configure b/src/configure index a18900e5a..f2980b850 100755 --- a/src/configure +++ b/src/configure @@ -6871,4 +6871,3 @@ if test "$no_create" != yes; then # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi - diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 7ee2584e2..f60699727 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -132,7 +132,7 @@ get_presence(FsmRef) -> %% Returns: {ok, StateName, StateData} | %% {ok, StateName, StateData, Timeout} | %% ignore | -%% {stop, StopReason} +%% {stop, StopReason} %%---------------------------------------------------------------------- init([{SockMod, Socket}, Opts]) -> Access = case lists:keysearch(access, 1, Opts) of @@ -178,7 +178,7 @@ init([{SockMod, Socket}, Opts]) -> %% Func: StateName/2 %% Returns: {next_state, NextStateName, NextStateData} | %% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} +%% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> @@ -313,7 +313,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> {stop, normal, StateData}; true -> send_text(StateData, Header), - fsm_next_state(wait_for_auth, + fsm_next_state(wait_for_auth, StateData#state{ server = Server, lang = Lang}) @@ -929,7 +929,7 @@ session_established(closed, StateData) -> %% {reply, Reply, NextStateName, NextStateData} | %% {reply, Reply, NextStateName, NextStateData, Timeout} | %% {stop, Reason, NewStateData} | -%% {stop, Reason, Reply, NewStateData} +%% {stop, Reason, Reply, NewStateData} %%---------------------------------------------------------------------- %state_name(Event, From, StateData) -> % Reply = ok, @@ -939,7 +939,7 @@ session_established(closed, StateData) -> %% Func: handle_event/3 %% Returns: {next_state, NextStateName, NextStateData} | %% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} +%% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- handle_event(_Event, StateName, StateData) -> fsm_next_state(StateName, StateData). @@ -951,7 +951,7 @@ handle_event(_Event, StateName, StateData) -> %% {reply, Reply, NextStateName, NextStateData} | %% {reply, Reply, NextStateName, NextStateData, Timeout} | %% {stop, Reason, NewStateData} | -%% {stop, Reason, Reply, NewStateData} +%% {stop, Reason, Reply, NewStateData} %%---------------------------------------------------------------------- handle_sync_event({get_presence}, _From, StateName, StateData) -> User = StateData#state.user, @@ -975,12 +975,11 @@ code_change(_OldVsn, StateName, StateData, _Extra) -> %% Func: handle_info/3 %% Returns: {next_state, NextStateName, NextStateData} | %% {next_state, NextStateName, NextStateData, Timeout} | -%% {stop, Reason, NewStateData} +%% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- handle_info({send_text, Text}, StateName, StateData) -> send_text(StateData, Text), ejabberd_hooks:run(c2s_loop_debug, [Text]), - fsm_next_state(StateName, StateData); handle_info(replaced, _StateName, StateData) -> Lang = StateData#state.lang, @@ -1848,7 +1847,7 @@ process_unauthenticated_stanza(StateData, El) -> jlib:make_jid("", "", ""), jlib:iq_to_xml(ResIQ)), send_element(StateData, jlib:remove_attr("to", Res1)); - _ -> + _ -> send_element(StateData, Res) end; _ -> diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 96e8e14de..540c12a6a 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -3,12 +3,12 @@ %%% Author : Alexey Shchepin %%% Purpose : S2S connections manager %%% Created : 7 Dec 2002 by Alexey Shchepin -%%% Id : $Id$ +%%% Id : $Id: ejabberd_s2s.erl 820 2007-07-19 21:17:13Z mremond $ %%%---------------------------------------------------------------------- -module(ejabberd_s2s). -author('alexey@sevcom.net'). --vsn('$Revision$ '). +-vsn('$Revision: 820 $ '). -behaviour(gen_server). @@ -26,7 +26,7 @@ %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). + terminate/2, code_change/3]). -include("ejabberd.hrl"). -include("jlib.hrl"). @@ -50,11 +50,11 @@ start_link() -> route(From, To, Packet) -> case catch do_route(From, To, Packet) of - {'EXIT', Reason} -> - ?ERROR_MSG("~p~nwhen processing: ~p", - [Reason, {From, To, Packet}]); - _ -> - ok + {'EXIT', Reason} -> + ?ERROR_MSG("~p~nwhen processing: ~p", + [Reason, {From, To, Packet}]); + _ -> + ok end. remove_connection(FromTo, Pid, Key) -> @@ -74,10 +74,10 @@ remove_connection(FromTo, Pid, Key) -> have_connection(FromTo) -> case catch mnesia:dirty_read(s2s, FromTo) of - [_] -> - true; - _ -> - false + [_] -> + true; + _ -> + false end. has_key(FromTo, Key) -> @@ -112,10 +112,10 @@ try_register(FromTo) -> end end, case mnesia:transaction(F) of - {atomic, Res} -> - Res; - _ -> - false + {atomic, Res} -> + Res; + _ -> + false end. dirty_get_connections() -> @@ -177,11 +177,11 @@ handle_info({mnesia_system_event, {mnesia_down, Node}}, State) -> {noreply, State}; handle_info({route, From, To, Packet}, State) -> case catch do_route(From, To, Packet) of - {'EXIT', Reason} -> - ?ERROR_MSG("~p~nwhen processing: ~p", - [Reason, {From, To, Packet}]); - _ -> - ok + {'EXIT', Reason} -> + ?ERROR_MSG("~p~nwhen processing: ~p", + [Reason, {From, To, Packet}]); + _ -> + ok end, {noreply, State}; handle_info(_Info, State) -> @@ -222,7 +222,7 @@ clean_table_from_bad_node(Node) -> do_route(From, To, Packet) -> ?DEBUG("s2s manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n", - [From, To, Packet, 8]), + [From, To, Packet, 8]), case find_connection(From, To) of {atomic, Pid} when pid(Pid) -> ?DEBUG("sending to process ~p~n", [Pid]), @@ -296,8 +296,11 @@ choose_pid(From, Pids) -> [] -> Pids; Ps -> Ps end, - %% use sticky connections based on the full JID of the sender - Pid = lists:nth(erlang:phash(From, length(Pids1)), Pids1), + % Use sticky connections based on the JID of the sender (whithout + % the resource to ensure that a muc room always uses the same + % connection) + Pid = lists:nth(erlang:phash(jlib:jid_remove_resource(From), length(Pids1)), + Pids1), ?DEBUG("Using ejabberd_s2s_out ~p~n", [Pid]), Pid. @@ -373,12 +376,12 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber, is_service(From, To) -> LFromDomain = From#jid.lserver, case ejabberd_config:get_local_option({route_subdomains, LFromDomain}) of - s2s -> % bypass RFC 3920 10.3 - false; - _ -> - LDstDomain = To#jid.lserver, - P = fun(Domain) -> is_subdomain(LDstDomain, Domain) end, - lists:any(P, ?MYHOSTS) + s2s -> % bypass RFC 3920 10.3 + false; + _ -> + LDstDomain = To#jid.lserver, + P = fun(Domain) -> is_subdomain(LDstDomain, Domain) end, + lists:any(P, ?MYHOSTS) end. %%-------------------------------------------------------------------- @@ -415,31 +418,30 @@ update_tables() -> mnesia:delete_table(s2s) end, case catch mnesia:table_info(s2s, attributes) of - [fromto, node, key] -> - mnesia:transform_table(s2s, ignore, [fromto, pid, key]), - mnesia:clear_table(s2s); - [fromto, pid, key] -> - ok; - {'EXIT', _} -> - ok + [fromto, node, key] -> + mnesia:transform_table(s2s, ignore, [fromto, pid, key]), + mnesia:clear_table(s2s); + [fromto, pid, key] -> + ok; + {'EXIT', _} -> + ok end, case lists:member(local_s2s, mnesia:system_info(tables)) of - true -> - mnesia:delete_table(local_s2s); - false -> - ok + true -> + mnesia:delete_table(local_s2s); + false -> + ok end. %% Check if host is in blacklist or white list allow_host(MyServer, S2SHost) -> case ejabberd_config:get_local_option({{s2s_host, S2SHost},MyServer}) of - deny -> false; - allow -> true; - _ -> - case ejabberd_config:get_local_option({s2s_default_policy, MyServer}) of - deny -> false; - allow -> true; - _ -> true %% The default s2s policy is allow - end + deny -> false; + allow -> true; + _ -> + case ejabberd_config:get_local_option({s2s_default_policy, MyServer}) of + deny -> false; + allow -> true; + _ -> true %% The default s2s policy is allow + end end. -