]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_s2s.erl: don't use the resource of the sender to choose
authorJérôme Sautret <jerome.sautret@process-one.net>
Tue, 30 Oct 2007 17:38:40 +0000 (17:38 +0000)
committerJérôme Sautret <jerome.sautret@process-one.net>
Tue, 30 Oct 2007 17:38:40 +0000 (17:38 +0000)
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
src/configure
src/ejabberd_c2s.erl
src/ejabberd_s2s.erl

index c87d57d0d5f32079caf0ac081349ca36e3c47c42..8df1e60f8714e3b0c14048be8369dc952c059c55 100644 (file)
@@ -1,6 +1,12 @@
 *.beam
 *~
 *.so
+*.flc
+*.log
+erl_crash.dump
+ejabberd.cfg
+ejabberd.sh
+Mnesia.*
 Makefile
 XmppAddr.asn1db
 XmppAddr.erl
index a18900e5a2809feeeee17d0ee943ef29aadd7fae..f2980b8504b89830faa3aa460c192f81b6cfc4c4 100755 (executable)
@@ -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
-
index 7ee2584e244c521b73263dbb95965a3b9181adb1..f606997274633f5bf07f36c791adbfc7bee8dc09 100644 (file)
@@ -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;
        _ ->
index 96e8e14de608b38c4ce657f85a3cfcac0232a05b..540c12a6ab6c03e7289b9531013ce716186bbd3e 100644 (file)
@@ -3,12 +3,12 @@
 %%% Author  : Alexey Shchepin <alexey@sevcom.net>
 %%% Purpose : S2S connections manager
 %%% Created :  7 Dec 2002 by Alexey Shchepin <alexey@sevcom.net>
-%%% 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.
-