Block messages from strangers before mod_mam/mod_offline processing
Fixes #1713
This commit is contained in:
parent
2acbf4625b
commit
1a58a201f8
|
@ -32,7 +32,7 @@
|
||||||
-export([start/2, stop/1, reload/3,
|
-export([start/2, stop/1, reload/3,
|
||||||
depends/2, mod_opt_type/1]).
|
depends/2, mod_opt_type/1]).
|
||||||
|
|
||||||
-export([filter_packet/1]).
|
-export([filter_packet/1, filter_offline_msg/1]).
|
||||||
|
|
||||||
-include("xmpp.hrl").
|
-include("xmpp.hrl").
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
@ -43,34 +43,54 @@
|
||||||
start(Host, _Opts) ->
|
start(Host, _Opts) ->
|
||||||
ejabberd_hooks:add(user_receive_packet, Host,
|
ejabberd_hooks:add(user_receive_packet, Host,
|
||||||
?MODULE, filter_packet, 25),
|
?MODULE, filter_packet, 25),
|
||||||
ok.
|
ejabberd_hooks:add(offline_message_hook, Host,
|
||||||
|
?MODULE, filter_offline_msg, 25).
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
ejabberd_hooks:delete(user_receive_packet, Host,
|
ejabberd_hooks:delete(user_receive_packet, Host,
|
||||||
?MODULE, filter_packet, 25),
|
?MODULE, filter_packet, 25),
|
||||||
ok.
|
ejabberd_hooks:delete(offline_message_hook, Host,
|
||||||
|
?MODULE, filter_offline_msg, 25).
|
||||||
|
|
||||||
reload(_Host, _NewOpts, _OldOpts) ->
|
reload(_Host, _NewOpts, _OldOpts) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
filter_packet({#message{} = Msg, State} = Acc) ->
|
filter_packet({#message{from = From} = Msg, State} = Acc) ->
|
||||||
From = xmpp:get_from(Msg),
|
|
||||||
LFrom = jid:tolower(From),
|
LFrom = jid:tolower(From),
|
||||||
LBFrom = jid:remove_resource(LFrom),
|
LBFrom = jid:remove_resource(LFrom),
|
||||||
#{pres_a := PresA, jid := JID, lserver := LServer} = State,
|
#{pres_a := PresA} = State,
|
||||||
|
case (?SETS):is_element(LFrom, PresA)
|
||||||
|
orelse (?SETS):is_element(LBFrom, PresA)
|
||||||
|
orelse sets_bare_member(LBFrom, PresA) of
|
||||||
|
false ->
|
||||||
|
case check_message(Msg) of
|
||||||
|
allow -> Acc;
|
||||||
|
deny -> {stop, {drop, Acc}}
|
||||||
|
end;
|
||||||
|
true ->
|
||||||
|
Acc
|
||||||
|
end;
|
||||||
|
filter_packet(Acc) ->
|
||||||
|
Acc.
|
||||||
|
|
||||||
|
filter_offline_msg({_Action, #message{} = Msg} = Acc) ->
|
||||||
|
case check_message(Msg) of
|
||||||
|
allow -> Acc;
|
||||||
|
deny -> {stop, {drop, Msg}}
|
||||||
|
end.
|
||||||
|
|
||||||
|
check_message(#message{from = From, to = To} = Msg) ->
|
||||||
|
LServer = To#jid.lserver,
|
||||||
AllowLocalUsers =
|
AllowLocalUsers =
|
||||||
gen_mod:get_module_opt(LServer, ?MODULE, allow_local_users, true),
|
gen_mod:get_module_opt(LServer, ?MODULE, allow_local_users, true),
|
||||||
case (Msg#message.body == [] andalso
|
case (Msg#message.body == [] andalso
|
||||||
Msg#message.subject == [])
|
Msg#message.subject == [])
|
||||||
orelse (AllowLocalUsers andalso
|
orelse (AllowLocalUsers andalso
|
||||||
ejabberd_router:is_my_route(From#jid.lserver))
|
ejabberd_router:is_my_route(From#jid.lserver)) of
|
||||||
orelse (?SETS):is_element(LFrom, PresA)
|
|
||||||
orelse (?SETS):is_element(LBFrom, PresA)
|
|
||||||
orelse sets_bare_member(LBFrom, PresA) of
|
|
||||||
false ->
|
false ->
|
||||||
{Sub, _} = ejabberd_hooks:run_fold(
|
{Sub, _} = ejabberd_hooks:run_fold(
|
||||||
roster_get_jid_info, LServer,
|
roster_get_jid_info, LServer,
|
||||||
{none, []}, [JID#jid.luser, LServer, From]),
|
{none, []}, [To#jid.luser, LServer, From]),
|
||||||
case Sub of
|
case Sub of
|
||||||
none ->
|
none ->
|
||||||
Drop = gen_mod:get_module_opt(LServer, ?MODULE, drop, true),
|
Drop = gen_mod:get_module_opt(LServer, ?MODULE, drop, true),
|
||||||
|
@ -85,18 +105,16 @@ filter_packet({#message{} = Msg, State} = Acc) ->
|
||||||
end,
|
end,
|
||||||
if
|
if
|
||||||
Drop ->
|
Drop ->
|
||||||
{stop, {drop, State}};
|
deny;
|
||||||
true ->
|
true ->
|
||||||
Acc
|
allow
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
Acc
|
allow
|
||||||
end;
|
end;
|
||||||
true ->
|
true ->
|
||||||
Acc
|
allow
|
||||||
end;
|
end.
|
||||||
filter_packet(Acc) ->
|
|
||||||
Acc.
|
|
||||||
|
|
||||||
sets_bare_member({U, S, <<"">>} = LBJID, Set) ->
|
sets_bare_member({U, S, <<"">>} = LBJID, Set) ->
|
||||||
case ?SETS:next(sets_iterator_from(LBJID, Set)) of
|
case ?SETS:next(sets_iterator_from(LBJID, Set)) of
|
||||||
|
|
Loading…
Reference in New Issue