diff options
Diffstat (limited to 'src/mod_pres_counter.erl')
-rw-r--r-- | src/mod_pres_counter.erl | 87 |
1 files changed, 44 insertions, 43 deletions
diff --git a/src/mod_pres_counter.erl b/src/mod_pres_counter.erl index e6f2cfbab..f151e6310 100644 --- a/src/mod_pres_counter.erl +++ b/src/mod_pres_counter.erl @@ -5,7 +5,7 @@ %%% Created : 23 Sep 2010 by Ahmed Omar %%% %%% -%%% ejabberd, Copyright (C) 2002-2016 ProcessOne +%%% ejabberd, Copyright (C) 2002-2019 ProcessOne %%% %%% This program is free software; you can redistribute it and/or %%% modify it under the terms of the GNU General Public License as @@ -25,15 +25,14 @@ -module(mod_pres_counter). --behavior(gen_mod). +-behaviour(gen_mod). --export([start/2, stop/1, check_packet/6, - mod_opt_type/1, depends/2]). +-export([start/2, stop/1, reload/3, check_packet/4, + mod_opt_type/1, mod_options/1, depends/2]). --include("ejabberd.hrl"). -include("logger.hrl"). --include("jlib.hrl"). +-include("xmpp.hrl"). -record(pres_counter, {dir, start, count, logged = false}). @@ -48,40 +47,40 @@ stop(Host) -> ?MODULE, check_packet, 25), ok. +reload(_Host, _NewOpts, _OldOpts) -> + ok. + depends(_Host, _Opts) -> []. -check_packet(_, _User, Server, _PrivacyList, - {From, To, #xmlel{name = Name, attrs = Attrs}}, Dir) -> - case Name of - <<"presence">> -> - IsSubscription = case fxml:get_attr_s(<<"type">>, Attrs) - of - <<"subscribe">> -> true; - <<"subscribed">> -> true; - <<"unsubscribe">> -> true; - <<"unsubscribed">> -> true; - _ -> false - end, - if IsSubscription -> - JID = case Dir of - in -> To; - out -> From - end, - update(Server, JID, Dir); - true -> allow - end; - _ -> allow - end. +-spec check_packet(allow | deny, ejabberd_c2s:state() | jid(), + stanza(), in | out) -> allow | deny. +check_packet(Acc, #{jid := JID}, Packet, Dir) -> + check_packet(Acc, JID, Packet, Dir); +check_packet(_, #jid{lserver = LServer}, + #presence{from = From, to = To, type = Type}, Dir) -> + IsSubscription = case Type of + subscribe -> true; + subscribed -> true; + unsubscribe -> true; + unsubscribed -> true; + _ -> false + end, + if IsSubscription -> + JID = case Dir of + in -> To; + out -> From + end, + update(LServer, JID, Dir); + true -> allow + end; +check_packet(Acc, _, _, _) -> + Acc. update(Server, JID, Dir) -> - StormCount = gen_mod:get_module_opt(Server, ?MODULE, count, - fun(I) when is_integer(I), I>0 -> I end, - 5), - TimeInterval = gen_mod:get_module_opt(Server, ?MODULE, interval, - fun(I) when is_integer(I), I>0 -> I end, - 60), - TimeStamp = p1_time_compat:system_time(seconds), + StormCount = mod_pres_counter_opt:count(Server), + TimeInterval = mod_pres_counter_opt:interval(Server), + TimeStamp = erlang:system_time(millisecond), case read(Dir) of undefined -> write(Dir, @@ -99,17 +98,17 @@ update(Server, JID, Dir) -> write(Dir, R#pres_counter{logged = true}), case Dir of in -> - ?WARNING_MSG("User ~s is being flooded, ignoring received " + ?WARNING_MSG("User ~ts is being flooded, ignoring received " "presence subscriptions", - [jid:to_string(JID)]); + [jid:encode(JID)]); out -> IP = ejabberd_sm:get_user_ip(JID#jid.luser, JID#jid.lserver, JID#jid.lresource), - ?WARNING_MSG("Flooder detected: ~s, on IP: ~s ignoring " + ?WARNING_MSG("Flooder detected: ~ts, on IP: ~ts ignoring " "sent presence subscriptions~n", - [jid:to_string(JID), - jlib:ip_to_list(IP)]) + [jid:encode(JID), + misc:ip_to_list(IP)]) end, {stop, deny}; true -> @@ -124,7 +123,9 @@ read(K) -> get({pres_counter, K}). write(K, V) -> put({pres_counter, K}, V). mod_opt_type(count) -> - fun (I) when is_integer(I), I > 0 -> I end; + econf:pos_int(); mod_opt_type(interval) -> - fun (I) when is_integer(I), I > 0 -> I end; -mod_opt_type(_) -> [count, interval]. + econf:timeout(second). + +mod_options(_) -> + [{count, 5}, {interval, timer:seconds(60)}]. |