diff options
author | Alexey Shchepin <alexey@process-one.net> | 2017-01-16 18:13:48 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2017-01-16 18:14:14 +0300 |
commit | fedfe5427c7978f7000148f3226a156ff3a3d103 (patch) | |
tree | 3573b631947dd2ce8a8f6cc8ac879e0ed9307c93 /src/mod_block_strangers.erl | |
parent | Don't allow raw elements in process_iq/3 (diff) |
Add mod_block_strangers
Diffstat (limited to 'src/mod_block_strangers.erl')
-rw-r--r-- | src/mod_block_strangers.erl | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/mod_block_strangers.erl b/src/mod_block_strangers.erl new file mode 100644 index 000000000..947970040 --- /dev/null +++ b/src/mod_block_strangers.erl @@ -0,0 +1,107 @@ +%%%------------------------------------------------------------------- +%%% File : mod_block_strangers.erl +%%% Author : Alexey Shchepin <alexey@process-one.net> +%%% Purpose : Block packets from non-subscribers +%%% Created : 25 Dec 2016 by Alexey Shchepin <alexey@process-one.net> +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2017 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%------------------------------------------------------------------- +-module(mod_block_strangers). + +-author('alexey@process-one.net'). + +-behaviour(gen_mod). + +%% API +-export([start/2, stop/1, + depends/2, mod_opt_type/1]). + +-export([filter_packet/3]). + +-include("xmpp.hrl"). +-include("ejabberd.hrl"). +-include("logger.hrl"). + +-define(SETS, gb_sets). + +start(Host, _Opts) -> + ejabberd_hooks:add(c2s_filter_incoming_packet, Host, + ?MODULE, filter_packet, 50), + ok. + +stop(Host) -> + ejabberd_hooks:delete(c2s_filter_incoming_packet, Host, + ?MODULE, filter_packet, 50), + ok. + +filter_packet(deny = Acc, _State, _Msg) -> + Acc; +filter_packet(Acc, State, Msg) -> + From = Msg#message.from, + LFrom = jid:tolower(From), + LBFrom = jid:remove_resource(LFrom), + #{pres_a := PresA} = State, + case false%ejabberd_router:is_my_route(From#jid.lserver) + orelse (?SETS):is_element(LFrom, PresA) + orelse (?SETS):is_element(LBFrom, PresA) + orelse sets_bare_member(LBFrom, PresA) of + true -> + Acc; + false -> + #{lserver := LServer} = State, + Drop = + gen_mod:get_module_opt(LServer, ?MODULE, drop, + fun(B) when is_boolean(B) -> B end, + true), + Log = + gen_mod:get_module_opt(LServer, ?MODULE, log, + fun(B) when is_boolean(B) -> B end, + false), + if + Log -> + Packet = xmpp:encode(Msg, ?NS_CLIENT), + ?INFO_MSG("Drop packet: ~s", + [fxml:element_to_binary(Packet)]); + true -> + ok + end, + if + Drop -> + deny; + true -> + Acc + end + end. + + +sets_bare_member({U, S, <<"">>} = LBJID, Set) -> + case ?SETS:next(?SETS:iterator_from(LBJID, Set)) of + {{U, S, _}, _} -> true; + _ -> false + end. + + +depends(_Host, _Opts) -> + []. + +mod_opt_type(drop) -> + fun (B) when is_boolean(B) -> B end; +mod_opt_type(log) -> + fun (B) when is_boolean(B) -> B end; +mod_opt_type(_) -> [drop, log]. |