diff options
Diffstat (limited to 'src/mod_block_strangers.erl')
-rw-r--r-- | src/mod_block_strangers.erl | 51 |
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}, |