aboutsummaryrefslogtreecommitdiff
path: root/src/mod_pres_counter.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_pres_counter.erl')
-rw-r--r--src/mod_pres_counter.erl87
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)}].