aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_s2s_in.erl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ejabberd_s2s_in.erl45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
index 170adbbc5..7c52dc025 100644
--- a/src/ejabberd_s2s_in.erl
+++ b/src/ejabberd_s2s_in.erl
@@ -13,7 +13,10 @@
-behaviour(gen_fsm).
%% External exports
--export([start/2, start_link/2, receiver/2, send_text/2, send_element/2]).
+-export([start/2,
+ start_link/2,
+ send_text/2,
+ send_element/2]).
%% gen_fsm callbacks
-export([init/1,
@@ -30,7 +33,10 @@
-define(DICT, dict).
--record(state, {socket, receiver, streamid,
+-record(state, {socket,
+ receiver,
+ streamid,
+ shaper,
connections = ?DICT:new()}).
@@ -68,8 +74,8 @@
start(SockData, Opts) ->
supervisor:start_child(ejabberd_s2s_in_sup, [SockData, Opts]).
-start_link(SockData, _Opts) ->
- gen_fsm:start_link(ejabberd_s2s_in, [SockData], ?FSMOPTS).
+start_link(SockData, Opts) ->
+ gen_fsm:start_link(ejabberd_s2s_in, [SockData, Opts], ?FSMOPTS).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
@@ -82,13 +88,18 @@ start_link(SockData, _Opts) ->
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
-init([{SockMod, Socket}]) ->
+init([{SockMod, Socket}, Opts]) ->
?INFO_MSG("started: ~p", [{SockMod, Socket}]),
- ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
+ ReceiverPid = ejabberd_receiver:start(Socket, SockMod, none),
+ Shaper = case lists:keysearch(shaper, 1, Opts) of
+ {value, {_, S}} -> S;
+ _ -> none
+ end,
{ok, wait_for_stream,
#state{socket = Socket,
receiver = ReceiverPid,
- streamid = new_id()},
+ streamid = new_id(),
+ shaper = Shaper},
?S2STIMEOUT}.
%%----------------------------------------------------------------------
@@ -133,6 +144,7 @@ stream_established({xmlstreamelement, El}, StateData) ->
Key, StateData#state.streamid}),
Conns = ?DICT:store({LFrom, LTo}, wait_for_verification,
StateData#state.connections),
+ change_shaper(StateData, jlib:make_jid("", LFrom, "")),
{next_state,
stream_established,
StateData#state{connections = Conns},
@@ -306,21 +318,6 @@ terminate(Reason, _StateName, StateData) ->
%%% Internal functions
%%%----------------------------------------------------------------------
-receiver(Socket, C2SPid) ->
- XMLStreamPid = xml_stream:start(C2SPid),
- receiver(Socket, C2SPid, XMLStreamPid).
-
-receiver(Socket, C2SPid, XMLStreamPid) ->
- case gen_tcp:recv(Socket, 0) of
- {ok, Text} ->
- xml_stream:send_text(XMLStreamPid, Text),
- receiver(Socket, C2SPid, XMLStreamPid);
- {error, _Reason} ->
- exit(XMLStreamPid, closed),
- gen_fsm:send_event(C2SPid, closed),
- ok
- end.
-
send_text(Socket, Text) ->
gen_tcp:send(Socket,Text).
@@ -328,6 +325,10 @@ send_element(Socket, El) ->
send_text(Socket, xml:element_to_string(El)).
+change_shaper(StateData, JID) ->
+ Shaper = acl:match_rule(StateData#state.shaper, JID),
+ ejabberd_receiver:change_shaper(StateData#state.receiver, Shaper).
+
new_id() ->
randoms:get_string().