aboutsummaryrefslogtreecommitdiff
path: root/src/mod_block_strangers.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_block_strangers.erl')
-rw-r--r--src/mod_block_strangers.erl51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/mod_block_strangers.erl b/src/mod_block_strangers.erl
index 486bea7fd..0fc83eab6 100644
--- a/src/mod_block_strangers.erl
+++ b/src/mod_block_strangers.erl
@@ -36,9 +36,12 @@
-include("xmpp.hrl").
-include("logger.hrl").
+-include("translate.hrl").
-define(SETS, gb_sets).
+-type c2s_state() :: ejabberd_c2s:state().
+
%%%===================================================================
%%% Callbacks and hooks
%%%===================================================================
@@ -61,6 +64,8 @@ stop(Host) ->
reload(_Host, _NewOpts, _OldOpts) ->
ok.
+-spec filter_packet({stanza(), c2s_state()}) -> {stanza(), c2s_state()} |
+ {stop, {drop, c2s_state()}}.
filter_packet({#message{from = From} = Msg, State} = Acc) ->
LFrom = jid:tolower(From),
LBFrom = jid:remove_resource(LFrom),
@@ -79,19 +84,21 @@ filter_packet({#message{from = From} = Msg, State} = Acc) ->
filter_packet(Acc) ->
Acc.
+-spec filter_offline_msg({_, message()}) -> {_, message()} | {stop, {drop, message()}}.
filter_offline_msg({_Action, #message{} = Msg} = Acc) ->
case check_message(Msg) of
allow -> Acc;
deny -> {stop, {drop, Msg}}
end.
+-spec filter_subscription(boolean(), presence()) -> boolean() | {stop, false}.
filter_subscription(Acc, #presence{meta = #{captcha := passed}}) ->
Acc;
filter_subscription(Acc, #presence{from = From, to = To, lang = Lang,
id = SID, type = subscribe} = Pres) ->
LServer = To#jid.lserver,
- case gen_mod:get_module_opt(LServer, ?MODULE, drop) andalso
- gen_mod:get_module_opt(LServer, ?MODULE, captcha) andalso
+ case mod_block_strangers_opt:drop(LServer) andalso
+ mod_block_strangers_opt:captcha(LServer) andalso
need_check(Pres) of
true ->
case check_subscription(From, To) of
@@ -106,7 +113,7 @@ filter_subscription(Acc, #presence{from = From, to = To, lang = Lang,
Msg = #message{from = BTo, to = From,
id = ID, body = Body,
sub_els = CaptchaEls},
- case gen_mod:get_module_opt(LServer, ?MODULE, log) of
+ case mod_block_strangers_opt:log(LServer) of
true ->
?INFO_MSG("Challenge subscription request "
"from stranger ~s to ~s with "
@@ -117,11 +124,11 @@ filter_subscription(Acc, #presence{from = From, to = To, lang = Lang,
end,
ejabberd_router:route(Msg);
{error, limit} ->
- ErrText = <<"Too many CAPTCHA requests">>,
+ ErrText = ?T("Too many CAPTCHA requests"),
Err = xmpp:err_resource_constraint(ErrText, Lang),
ejabberd_router:route_error(Pres, Err);
_ ->
- ErrText = <<"Unable to generate a CAPTCHA">>,
+ ErrText = ?T("Unable to generate a CAPTCHA"),
Err = xmpp:err_internal_server_error(ErrText, Lang),
ejabberd_router:route_error(Pres, Err)
end,
@@ -135,24 +142,26 @@ filter_subscription(Acc, #presence{from = From, to = To, lang = Lang,
filter_subscription(Acc, _) ->
Acc.
+-spec handle_captcha_result(captcha_succeed | captcha_failed, presence()) -> ok.
handle_captcha_result(captcha_succeed, Pres) ->
Pres1 = xmpp:put_meta(Pres, captcha, passed),
ejabberd_router:route(Pres1);
handle_captcha_result(captcha_failed, #presence{lang = Lang} = Pres) ->
- Txt = <<"The CAPTCHA verification has failed">>,
+ Txt = ?T("The CAPTCHA verification has failed"),
ejabberd_router:route_error(Pres, xmpp:err_not_allowed(Txt, Lang)).
%%%===================================================================
%%% Internal functions
%%%===================================================================
+-spec check_message(message()) -> allow | deny.
check_message(#message{from = From, to = To, lang = Lang} = Msg) ->
LServer = To#jid.lserver,
case need_check(Msg) of
true ->
case check_subscription(From, To) of
false ->
- Drop = gen_mod:get_module_opt(LServer, ?MODULE, drop),
- Log = gen_mod:get_module_opt(LServer, ?MODULE, log),
+ Drop = mod_block_strangers_opt:drop(LServer),
+ Log = mod_block_strangers_opt:log(LServer),
if
Log ->
?INFO_MSG("~s message from stranger ~s to ~s",
@@ -165,7 +174,7 @@ check_message(#message{from = From, to = To, lang = Lang} = Msg) ->
end,
if
Drop ->
- Txt = <<"Messages from strangers are rejected">>,
+ Txt = ?T("Messages from strangers are rejected"),
Err = xmpp:err_policy_violation(Txt, Lang),
Msg1 = maybe_adjust_from(Msg),
ejabberd_router:route_error(Msg1, Err),
@@ -199,8 +208,8 @@ need_check(Pkt) ->
_ ->
false
end,
- AllowLocalUsers = gen_mod:get_module_opt(LServer, ?MODULE, allow_local_users),
- Access = gen_mod:get_module_opt(LServer, ?MODULE, access),
+ AllowLocalUsers = mod_block_strangers_opt:allow_local_users(LServer),
+ Access = mod_block_strangers_opt:access(LServer),
not (IsSelf orelse IsEmpty
orelse acl:match_rule(LServer, Access, From) == allow
orelse ((AllowLocalUsers orelse From#jid.luser == <<"">>)
@@ -215,12 +224,13 @@ check_subscription(From, To) ->
false;
false ->
%% Check if the contact's server is in the roster
- gen_mod:get_module_opt(LocalServer, ?MODULE, allow_transports)
+ mod_block_strangers_opt:allow_transports(LocalServer)
andalso mod_roster:is_subscribed(jid:make(RemoteServer), To);
true ->
true
end.
+-spec sets_bare_member(ljid(), ?SETS:set()) -> boolean().
sets_bare_member({U, S, <<"">>} = LBJID, Set) ->
case ?SETS:next(?SETS:iterator_from(LBJID, Set)) of
{{U, S, _}, _} -> true;
@@ -230,19 +240,18 @@ sets_bare_member({U, S, <<"">>} = LBJID, Set) ->
depends(_Host, _Opts) ->
[].
+mod_opt_type(access) ->
+ econf:acl();
mod_opt_type(drop) ->
- fun (B) when is_boolean(B) -> B end;
+ econf:bool();
mod_opt_type(log) ->
- fun (B) when is_boolean(B) -> B end;
+ econf:bool();
+mod_opt_type(captcha) ->
+ econf:bool();
mod_opt_type(allow_local_users) ->
- fun (B) when is_boolean(B) -> B end;
+ econf:bool();
mod_opt_type(allow_transports) ->
- fun (B) when is_boolean(B) -> B end;
-mod_opt_type(captcha) ->
- fun (B) when is_boolean(B) -> B end;
-mod_opt_type(access) ->
- fun acl:access_rules_validator/1.
-
+ econf:bool().
mod_options(_) ->
[{access, none},