aboutsummaryrefslogtreecommitdiff
path: root/src/mod_sic.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2010-03-08 13:58:06 +0100
committerBadlop <badlop@process-one.net>2010-03-08 13:58:06 +0100
commit63ccbe90d3cf5a6aa1014e0e8f2deede305e00f5 (patch)
tree84420d64d6d822bb100e446792c5a867ee574732 /src/mod_sic.erl
parentFix warnings about unused variable. (diff)
Implement XEP-0279: Server IP Check (thanks to Karim Gemayel)(EJAB-1205)
Diffstat (limited to 'src/mod_sic.erl')
-rw-r--r--src/mod_sic.erl97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/mod_sic.erl b/src/mod_sic.erl
new file mode 100644
index 000000000..e487539cd
--- /dev/null
+++ b/src/mod_sic.erl
@@ -0,0 +1,97 @@
+%%%----------------------------------------------------------------------
+%%% File : mod_sic.erl
+%%% Author : Karim Gemayel <karim.gemayel@process-one.net>
+%%% Purpose : XEP-0279 Server IP Check
+%%% Created : 6 Mar 2010 by Karim Gemayel <karim.gemayel@process-one.net>
+%%%
+%%%
+%%% ejabberd, Copyright (C) 2002-2010 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., 59 Temple Place, Suite 330, Boston, MA
+%%% 02111-1307 USA
+%%%
+%%%----------------------------------------------------------------------
+
+-module(mod_sic).
+-author('karim.gemayel@process-one.net').
+
+-behaviour(gen_mod).
+
+-export([start/2,
+ stop/1,
+ process_local_iq/3,
+ process_sm_iq/3
+ ]).
+
+-include("ejabberd.hrl").
+-include("jlib.hrl").
+
+-define(NS_SIC, "urn:xmpp:sic:0").
+
+start(Host, Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
+ gen_iq_handler:add_iq_handler(ejabberd_local, Host,
+ ?NS_SIC, ?MODULE, process_local_iq, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
+ ?NS_SIC, ?MODULE, process_sm_iq, IQDisc).
+
+stop(Host) ->
+ gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_SIC),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_SIC).
+
+
+process_local_iq(#jid{user = User, server = Server, resource = Resource}, _To,
+ #iq{type = 'get', sub_el = _SubEl} = IQ) ->
+ get_ip({User, Server, Resource}, IQ);
+
+process_local_iq(_From, _To, #iq{type = 'set', sub_el = SubEl} = IQ) ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+
+process_local_iq(_From, _To, #iq{sub_el = SubEl} = IQ) ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_UNEXPECTED_REQUEST]}.
+
+
+process_sm_iq(#jid{user = User, server = Server, resource = Resource},
+ #jid{user = User, server = Server},
+ #iq{type = 'get', sub_el = _SubEl} = IQ) ->
+ get_ip({User, Server, Resource}, IQ);
+
+process_sm_iq(_From, _To, #iq{type = 'get', sub_el = SubEl} = IQ) ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_FORBIDDEN]};
+
+process_sm_iq(_From, _To, #iq{type = 'set', sub_el = SubEl} = IQ) ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+
+process_sm_iq(_From, _To, #iq{sub_el = SubEl} = IQ) ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_UNEXPECTED_REQUEST]}.
+
+
+get_ip({User, Server, Resource},
+ #iq{sub_el = {xmlelement, Name, Attrs, _} = SubEl} = IQ) ->
+ case ejabberd_sm:get_user_ip(User, Server, Resource) of
+ {IP, _} when is_tuple(IP) ->
+ IQ#iq{
+ type = 'result',
+ sub_el = [
+ {xmlelement, Name, Attrs,
+ [{xmlcdata, list_to_binary(inet_parse:ntoa(IP))}]}
+ ]
+ };
+ _ ->
+ IQ#iq{
+ type = 'error',
+ sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]
+ }
+ end.