summaryrefslogtreecommitdiff
path: root/src/mod_fail2ban.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2014-08-15 13:40:04 +0400
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2014-08-27 13:17:56 +0400
commit2430e6691bcd3e31bd1c36fb5f2fe78d205b92d4 (patch)
treeb140a632085b9a9f7d0915ef1da5929f1504dd4b /src/mod_fail2ban.erl
parentRecompile the xmpp_codec using updated XML generator (diff)
Add mod_fail2ban
Diffstat (limited to 'src/mod_fail2ban.erl')
-rw-r--r--src/mod_fail2ban.erl55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/mod_fail2ban.erl b/src/mod_fail2ban.erl
new file mode 100644
index 00000000..ef40433d
--- /dev/null
+++ b/src/mod_fail2ban.erl
@@ -0,0 +1,55 @@
+%%%-------------------------------------------------------------------
+%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%% @copyright (C) 2014, Evgeny Khramtsov
+%%% @doc
+%%%
+%%% @end
+%%% Created : 15 Aug 2014 by Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%%-------------------------------------------------------------------
+-module(mod_fail2ban).
+
+-behaviour(gen_mod).
+
+%% API
+-export([start/2, stop/1, c2s_auth_result/4]).
+
+-include("jlib.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+start(Host, _Opts) ->
+ ets:new(failed_auth, [bag, named_table, public]),
+ ejabberd_hooks:add(c2s_auth_result, Host, ?MODULE, c2s_auth_result, 100).
+
+stop(Host) ->
+ ejabberd_hooks:delete(c2s_auth_result, Host, ?MODULE, c2s_auth_result, 100).
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+c2s_auth_result(true, User, Server, {Addr, _Port}) ->
+ case jlib:make_jid(User, Server, <<"">>) of
+ #jid{luser = LUser, lserver = LServer} ->
+ US = {LUser, LServer},
+ Objs = ets:lookup(failed_auth, Addr),
+ case lists:filter(fun({_, US1, _}) -> US1 == US end, Objs) of
+ [_|_] ->
+ ets:match_delete(failed_auth, {'_', US, '_'});
+ [] ->
+ true
+ end;
+ _ ->
+ false
+ end;
+c2s_auth_result(false, User, Server, {Addr, _Port}) ->
+ case jlib:make_jid(User, Server, <<"">>) of
+ #jid{luser = LUser, lserver = LServer} ->
+ US = {LUser, LServer},
+ ets:insert(failed_auth, {Addr, US, now()}),
+ Objs = ets:match_object(failed_auth, {'_', US, '_'}),
+ Timeout = round(math:exp(length(Objs))),
+ timer:sleep(timer:seconds(Timeout));
+ _ ->
+ ok
+ end.