aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 72ebdb5b0..bbde72745 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -45,6 +45,7 @@
set_aux_field/3,
del_aux_field/2,
get_subscription/2,
+ send_filtered/5,
broadcast/4,
get_subscribed/1,
transform_listen_option/2]).
@@ -247,6 +248,9 @@ get_subscription(LFrom, StateData) ->
true -> none
end.
+send_filtered(FsmRef, Feature, From, To, Packet) ->
+ FsmRef ! {send_filtered, Feature, From, To, Packet}.
+
broadcast(FsmRef, Type, From, Packet) ->
FsmRef ! {broadcast, Type, From, Packet}.
@@ -1738,6 +1742,26 @@ handle_info({force_update_presence, LUser}, StateName,
_ -> StateData
end,
fsm_next_state(StateName, NewStateData);
+handle_info({send_filtered, Feature, From, To, Packet}, StateName, StateData) ->
+ Drop = ejabberd_hooks:run_fold(c2s_filter_packet, StateData#state.server,
+ true, [StateData#state.server, StateData,
+ Feature, To, Packet]),
+ NewStateData = if Drop ->
+ ?DEBUG("Dropping packet from ~p to ~p",
+ [jlib:jid_to_string(From),
+ jlib:jid_to_string(To)]),
+ StateData;
+ true ->
+ FinalPacket = jlib:replace_from_to(From, To, Packet),
+ case StateData#state.jid of
+ To ->
+ send_packet(StateData, FinalPacket);
+ _ ->
+ ejabberd_router:route(From, To, FinalPacket),
+ StateData
+ end
+ end,
+ fsm_next_state(StateName, NewStateData);
handle_info({broadcast, Type, From, Packet}, StateName, StateData) ->
Recipients = ejabberd_hooks:run_fold(
c2s_broadcast_recipients, StateData#state.server,