Skip to content

Commit

Permalink
Introduce option 'allow_transports'
Browse files Browse the repository at this point in the history
This is a boolean option. If set to `true` and some server's JID
is in user's roster, then messages from any user of this server are
accepted even if no subscription present.

The option is enabled by default.
  • Loading branch information
zinid committed Sep 8, 2017
1 parent 9e35af5 commit dfd2045
Showing 1 changed file with 39 additions and 10 deletions.
49 changes: 39 additions & 10 deletions src/mod_block_strangers.erl
Expand Up @@ -86,20 +86,19 @@ check_message(#message{from = From, to = To} = Msg) ->
case (Msg#message.body == [] andalso
Msg#message.subject == [])
orelse ((AllowLocalUsers orelse From#jid.luser == <<"">>) andalso
ejabberd_router:is_my_route(From#jid.lserver)) of
ejabberd_router:is_my_host(From#jid.lserver)) of
false ->
{Sub, _} = ejabberd_hooks:run_fold(
roster_get_jid_info, LServer,
{none, []}, [To#jid.luser, LServer, From]),
case Sub of
case check_subscription(From, To) of
none ->
Drop = gen_mod:get_module_opt(LServer, ?MODULE, drop, true),
Log = gen_mod:get_module_opt(LServer, ?MODULE, log, false),
if
Log ->
?INFO_MSG("Dropping message from ~s to ~s: "
"the sender is not in the roster",
[jid:encode(From), jid:encode(To)]);
?INFO_MSG("~s message from stranger ~s to ~s",
[if Drop -> "Dropping";
true -> "Allow"
end,
jid:encode(From), jid:encode(To)]);
true ->
ok
end,
Expand All @@ -109,13 +108,41 @@ check_message(#message{from = From, to = To} = Msg) ->
true ->
allow
end;
_ ->
some ->
allow
end;
true ->
allow
end.

-spec check_subscription(jid(), jid()) -> none | some.
check_subscription(From, To) ->
{LocalUser, LocalServer, _} = jid:tolower(To),
{RemoteUser, RemoteServer, _} = jid:tolower(From),
case ejabberd_hooks:run_fold(
roster_get_jid_info, LocalServer,
{none, []}, [LocalUser, LocalServer, From]) of
{none, _} when RemoteUser == <<"">> ->
none;
{none, _} ->
case gen_mod:get_module_opt(LocalServer, ?MODULE,
allow_transports, true) of
true ->
%% Check if the contact's server is in the roster
case ejabberd_hooks:run_fold(
roster_get_jid_info, LocalServer,
{none, []},
[LocalUser, LocalServer, jid:make(RemoteServer)]) of
{none, _} -> none;
_ -> some
end;
false ->
none
end;
_ ->
some
end.

sets_bare_member({U, S, <<"">>} = LBJID, Set) ->
case ?SETS:next(sets_iterator_from(LBJID, Set)) of
{{U, S, _}, _} -> true;
Expand Down Expand Up @@ -151,4 +178,6 @@ mod_opt_type(log) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(allow_local_users) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(_) -> [drop, log, allow_local_users].
mod_opt_type(allow_transports) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(_) -> [drop, log, allow_local_users, allow_transports].

0 comments on commit dfd2045

Please sign in to comment.