From dcfaa68b7d80feae550168eca252e485acbd6974 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Wed, 22 Jan 2003 20:40:40 +0000 Subject: [PATCH] *** empty log message *** SVN Revision: 47 --- src/.cvsignore | 1 + src/ejabberd.cfg | 13 ++++++++ src/ejabberd.erl | 12 +++++++ src/ejabberd_local.erl | 36 ++++++++++++-------- src/ejabberd_sm.erl | 12 ++++++- src/gen_iq_handler.erl | 74 ++++++++++++++++++++++++++++++++++++++++++ src/mod_configure.erl | 50 ++++++++++++++++++++++++---- src/mod_disco.erl | 41 ++++++++++++++--------- src/mod_private.erl | 7 ++-- src/mod_register.erl | 9 ++--- src/mod_roster.erl | 44 +++++++------------------ src/mod_stats.erl | 7 ++-- src/mod_time.erl | 11 +++---- src/mod_vcard.erl | 12 +++---- src/mod_version.erl | 9 +++-- 15 files changed, 241 insertions(+), 97 deletions(-) create mode 100644 src/.cvsignore create mode 100644 src/gen_iq_handler.erl diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 000000000..17278c08c --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1 @@ +*.beam diff --git a/src/ejabberd.cfg b/src/ejabberd.cfg index 464a1f7a1..cfc1a8b55 100644 --- a/src/ejabberd.cfg +++ b/src/ejabberd.cfg @@ -21,6 +21,19 @@ {8888, ejabberd_service, start, ["asd.e.localhost", "asdqwe"]} ]}. +{modules, [ + {mod_register, [one_queue]}, + {mod_roster, [one_queue]}, + {mod_configure, [one_queue]}, + {mod_disco, [one_queue]}, + {mod_stats, [one_queue]}, + {mod_vcard, [one_queue]}, + {mod_offline, []}, + {mod_echo, []}, + {mod_private, [one_queue]}, + {mod_time, [one_queue]}, + {mod_version, [one_queue]} + ]}. diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 0e4f50954..be9deb6a3 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -35,6 +35,7 @@ init() -> ejabberd_s2s:start(), ejabberd_local:start(), ejabberd_listener:start(), + load_modules(), loop(Port). @@ -53,3 +54,14 @@ db_init() -> end, mnesia:start(), mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity). + +load_modules() -> + case ejabberd_config:get_local_option(modules) of + undefined -> + ok; + Modules -> + lists:foreach(fun({Module, Args}) -> + apply(Module, start, Args) + end, Modules) + end. + diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index ddae487be..88cea3354 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -12,7 +12,8 @@ -export([start/0, init/0]). --export([register_iq_handler/3]). +-export([register_iq_handler/3, + register_iq_handler/4]). -include("ejabberd.hrl"). @@ -20,17 +21,17 @@ start() -> register(ejabberd_local, spawn(ejabberd_local, init, [])), - mod_register:start(), - mod_roster:start(), - mod_configure:start(), - mod_disco:start(), - mod_stats:start(), - mod_vcard:start(), - mod_offline:start(), - mod_echo:start(), - mod_private:start(), - mod_time:start(), - mod_version:start(), + %mod_register:start(one_queue), + %mod_roster:start(one_queue), + %mod_configure:start(one_queue), + %mod_disco:start(one_queue), + %mod_stats:start(one_queue), + %mod_vcard:start(one_queue), + %mod_offline:start(), + %mod_echo:start(), + %mod_private:start(one_queue), + %mod_time:start(one_queue), + %mod_version:start(one_queue), ok. init() -> @@ -47,6 +48,10 @@ loop(State) -> {register_iq_handler, XMLNS, Module, Function} -> ets:insert(State#state.iqtable, {XMLNS, Module, Function}), mod_disco:register_feature(XMLNS), + loop(State); + {register_iq_handler, XMLNS, Module, Function, Opts} -> + ets:insert(State#state.iqtable, {XMLNS, Module, Function, Opts}), + mod_disco:register_feature(XMLNS), loop(State) end. @@ -82,7 +87,6 @@ process_iq(State, From, To, Packet) -> {iq, ID, Type, XMLNS, SubEl} -> case jlib:is_iq_request_type(Type) of true -> - % TODO case ets:lookup(State#state.iqtable, XMLNS) of [{_, Module, Function}] -> ResIQ = apply(Module, Function, [From, To, IQ]), @@ -95,6 +99,9 @@ process_iq(State, From, To, Packet) -> true -> ok end; + [{_, Module, Function, Opts}] -> + gen_iq_handler:handle(Module, Function, Opts, + From, To, IQ); [] -> Err = jlib:make_error_reply( Packet, "501", "Not Implemented"), @@ -118,3 +125,6 @@ process_iq(State, From, To, Packet) -> register_iq_handler(XMLNS, Module, Fun) -> ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun}. + +register_iq_handler(XMLNS, Module, Fun, Opts) -> + ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun, Opts}. diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 9e74177ea..a6c5efa0a 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -16,7 +16,8 @@ unset_presence/2, dirty_get_sessions_list/0, dirty_get_my_sessions_list/0, - register_iq_handler/3]). + register_iq_handler/3, + register_iq_handler/4]). -include_lib("mnemosyne/include/mnemosyne.hrl"). -include("ejabberd.hrl"). @@ -73,6 +74,9 @@ loop() -> {register_iq_handler, XMLNS, Module, Function} -> ets:insert(sm_iqtable, {XMLNS, Module, Function}), loop(); + {register_iq_handler, XMLNS, Module, Function, Opts} -> + ets:insert(sm_iqtable, {XMLNS, Module, Function, Opts}), + loop(); _ -> loop() end. @@ -363,6 +367,9 @@ process_iq(From, To, Packet) -> true -> ok end; + [{_, Module, Function, Opts}] -> + gen_iq_handler:handle(Module, Function, Opts, + From, To, IQ); [] -> Err = jlib:make_error_reply( Packet, "501", "Not Implemented"), @@ -379,3 +386,6 @@ process_iq(From, To, Packet) -> register_iq_handler(XMLNS, Module, Fun) -> ejabberd_sm ! {register_iq_handler, XMLNS, Module, Fun}. +register_iq_handler(XMLNS, Module, Fun, Opts) -> + ejabberd_sm ! {register_iq_handler, XMLNS, Module, Fun, Opts}. + diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl new file mode 100644 index 000000000..614061085 --- /dev/null +++ b/src/gen_iq_handler.erl @@ -0,0 +1,74 @@ +%%%---------------------------------------------------------------------- +%%% File : gen_iq_handler.erl +%%% Author : Alexey Shchepin +%%% Purpose : +%%% Created : 22 Jan 2003 by Alexey Shchepin +%%% Id : $Id$ +%%%---------------------------------------------------------------------- + +-module(gen_iq_handler). +-author('alexey@sevcom.net'). +-vsn('$Revision$ '). + +-export([start/0, + add_iq_handler/5, + handle/6, + process_iq/5, + queue_init/2]). + +-include("ejabberd.hrl"). + +start() -> + ok. + +add_iq_handler(Component, NS, Module, Function, Type) -> + case Type of + no_queue -> + Component:register_iq_handler(NS, Module, Function, no_queue); + one_queue -> + Pid = spawn(?MODULE, queue_init, [Module, Function]), + Component:register_iq_handler(NS, Module, Function, + {one_queue, Pid}); + parallel -> + Component:register_iq_handler(NS, Module, Function, parallel) + end. + +handle(Module, Function, Opts, From, To, IQ) -> + case Opts of + no_queue -> + process_iq(Module, Function, From, To, IQ); + {one_queue, Pid} -> + Pid ! {process_iq, From, To, IQ}; + parallel -> + spawn(?MODULE, process_iq, [Module, Function, From, To, IQ]); + _ -> + todo + end. + + +process_iq(Module, Function, From, To, IQ) -> + case catch Module:Function(From, To, IQ) of + {'EXIT', Reason} -> + ?ERROR_MSG("~p", [Reason]); + ResIQ -> + if + ResIQ /= ignore -> + ejabberd_router:route(To, From, + jlib:iq_to_xml(ResIQ)); + true -> + ok + end + end. + +queue_init(Module, Function) -> + queue_loop(Module, Function). + +% TODO: use gen_event +queue_loop(Module, Function) -> + receive + {process_iq, From, To, IQ} -> + process_iq(Module, Function, From, To, IQ), + queue_loop(Module, Function); + _ -> + queue_loop(Module, Function) + end. diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 5ae67513f..2567c9963 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -10,7 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, +-export([start/1, process_local_iq/3, process_sm_iq/3]). @@ -18,11 +18,11 @@ -include("namespaces.hrl"). -start() -> - ejabberd_local:register_iq_handler(?NS_XDATA, - ?MODULE, process_local_iq), - ejabberd_sm:register_iq_handler(?NS_XDATA, - ?MODULE, process_sm_iq), +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_XDATA, + ?MODULE, process_local_iq, Type), + gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_XDATA, + ?MODULE, process_sm_iq, Type), ok. @@ -163,7 +163,7 @@ get_form(["config", "hostname"], Lang) -> {result, [{xmlelement, "title", [], [{xmlcdata, translate:translate( - Lang, "DB Tables Configuration")}]}, + Lang, "Hostname Configuration")}]}, {xmlelement, "instructions", [], [{xmlcdata, translate:translate( @@ -175,6 +175,30 @@ get_form(["config", "hostname"], Lang) -> [{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]}]} ]}; +get_form(["config", "acls"], Lang) -> + {result, [{xmlelement, "title", [], + [{xmlcdata, + translate:translate( + Lang, "ACLs Configuration")}]}, + %{xmlelement, "instructions", [], + % [{xmlcdata, + % translate:translate( + % Lang, "")}]}, + {xmlelement, "field", [{"type", "text-multi"}, + {"label", + translate:translate(Lang, "ACLs")}, + {"var", "acls"}], + lists:map(fun(S) -> + {xmlelement, "value", [], [{xmlcdata, S}]} + end, + string:tokens( + lists:flatten(io_lib:format("~p", + [ets:tab2list(acls)])), + "\n")) + %{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]} + } + ]}; + get_form(_, Lang) -> {error, "503", "Service Unavailable"}. @@ -324,6 +348,18 @@ get_sm_form(User, [], Lang) -> % [{xmlcdata, % translate:translate( % Lang, "Choose host name")}]}, + {xmlelement, "field", + [{"type", "list-single"}, + {"label", translate:translate(Lang, "Action on user")}, + {"var", "action"}], + [{xmlelement, "value", [], [{xmlcdata, "edit"}]}, + {xmlelement, "option", + [{"label", translate:translate(Lang, "Edit Properties")}], + [{xmlelement, "value", [], [{xmlcdata, "edit"}]}]}, + {xmlelement, "option", + [{"label", translate:translate(Lang, "Remove User")}], + [{xmlelement, "value", [], [{xmlcdata, "remove"}]}]} + ]}, ?XFIELD("text-private", "Password", "password", ejabberd_auth:get_password_s(User)) %{xmlelement, "field", [{"type", "text-single"}, diff --git a/src/mod_disco.erl b/src/mod_disco.erl index b0574d31a..141feaf1d 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -10,7 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, init/0, +-export([start/1, process_local_iq_items/3, process_local_iq_info/3, process_sm_iq_items/3, @@ -24,23 +24,28 @@ {iq, ID, result, XMLNS, [{xmlelement, "query", [{"xmlns", ?NS_DISCO_INFO}], []}]}). -start() -> - ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS, - ?MODULE, process_local_iq_items), - ejabberd_local:register_iq_handler(?NS_DISCO_INFO, - ?MODULE, process_local_iq_info), - ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS, - ?MODULE, process_sm_iq_items), - ejabberd_sm:register_iq_handler(?NS_DISCO_INFO, - ?MODULE, process_sm_iq_info), +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_ITEMS, + ?MODULE, process_local_iq_items, Type), + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_INFO, + ?MODULE, process_local_iq_info, Type), + gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_ITEMS, + ?MODULE, process_sm_iq_items, Type), + gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_INFO, + ?MODULE, process_sm_iq_info, Type), + %ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS, + % ?MODULE, process_local_iq_items), + %ejabberd_local:register_iq_handler(?NS_DISCO_INFO, + % ?MODULE, process_local_iq_info), + %ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS, + % ?MODULE, process_sm_iq_items), + %ejabberd_sm:register_iq_handler(?NS_DISCO_INFO, + % ?MODULE, process_sm_iq_info), register_feature("iq"), register_feature("presence"), register_feature("presence-invisible"), ok. -init() -> - ok. - register_feature(Feature) -> catch ets:new(disco_features, [named_table, ordered_set, public]), ets:insert(disco_features, {Feature}). @@ -157,9 +162,10 @@ get_local_items([], Server, Lang) -> get_local_items(["config"], Server, Lang) -> {result, - [?NODE("Host Name", "config/hostname"), - ?NODE("ACLs", "config/acls"), - ?NODE("Access Rules", "config/access") + [?NODE("Host Name", "config/hostname"), + ?NODE("ACLs", "config/acls"), + ?NODE("Access Rules", "config/access"), + ?NODE("Loaded Modules", "config/modules") ]}; get_local_items(["config", _], Server, Lang) -> @@ -174,6 +180,9 @@ get_local_items(["all users"], Server, Lang) -> get_local_items(["outgoing s2s"], Server, Lang) -> {result, get_outgoing_s2s(Lang)}; +get_local_items(["outgoing s2s", To], Server, Lang) -> + {result, get_outgoing_s2s(Lang, To)}; + get_local_items(["running nodes"], Server, Lang) -> {result, get_running_nodes(Lang)}; diff --git a/src/mod_private.erl b/src/mod_private.erl index 4f8164c12..1ed49f3db 100644 --- a/src/mod_private.erl +++ b/src/mod_private.erl @@ -10,7 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, +-export([start/1, process_local_iq/3]). -include("ejabberd.hrl"). @@ -18,11 +18,12 @@ -record(private_storage, {userns, xml}). -start() -> +start(Type) -> mnesia:create_table(private_storage, [{disc_only_copies, [node()]}, {attributes, record_info(fields, private_storage)}]), - ejabberd_local:register_iq_handler(?NS_PRIVATE, ?MODULE, process_local_iq). + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_PRIVATE, + ?MODULE, process_local_iq, Type). process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> diff --git a/src/mod_register.erl b/src/mod_register.erl index 3901f58fb..247b76b71 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -10,13 +10,14 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, init/0, process_iq/3]). +-export([start/1, init/0, process_iq/3]). -include("ejabberd.hrl"). +-include("namespaces.hrl"). -start() -> - ejabberd_local:register_iq_handler("jabber:iq:register", - ?MODULE, process_iq), +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_REGISTER, + ?MODULE, process_iq, Type), ok. init() -> diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 213c46554..56df1bc48 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -12,8 +12,9 @@ -export([]). --export([start/0, init/0, +-export([start/1, process_iq/3, + process_local_iq/3, get_subscription_lists/1, in_subscription/3, out_subscription/3]). @@ -32,40 +33,19 @@ xattrs = [], xs = []}). --define(ME, ejabberd_mod_roster). - -start() -> - register(?ME, spawn(mod_roster, init, [])). - -init() -> +start(Type) -> mnesia:create_table(roster,[{disc_copies, [node()]}, {attributes, record_info(fields, roster)}]), mnesia:add_table_index(roster, user), - ejabberd_local:register_iq_handler(?NS_ROSTER, - ?MODULE, process_iq), - loop(). + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_ROSTER, + ?MODULE, process_local_iq, Type). -loop() -> - receive - {process_iq, From, To, {iq, ID, Type, XMLNS, SubEl}} -> - case Type of - set -> - ResIQ = process_iq_set(From, To, - {iq, ID, Type, XMLNS, SubEl}), - ejabberd_router ! {route, - To, - From, - jlib:iq_to_xml(ResIQ)}, - loop(); - get -> - ResIQ = process_iq_get(From, To, - {iq, ID, Type, XMLNS, SubEl}), - ejabberd_router ! {route, - To, - From, - jlib:iq_to_xml(ResIQ)}, - loop() - end +process_local_iq(From, To, {iq, _, Type, _, _} = IQ) -> + case Type of + set -> + process_iq_set(From, To, IQ); + get -> + process_iq_get(From, To, IQ) end. @@ -75,7 +55,7 @@ process_iq(From, To, IQ) -> {_, Server, _} = From, case ?MYNAME of Server -> - ?ME ! {process_iq, From, To, IQ}, + process_local_iq(From, To, IQ), ignore; _ -> {iq, ID, error, XMLNS, diff --git a/src/mod_stats.erl b/src/mod_stats.erl index 3eff2621a..a6f4eb62d 100644 --- a/src/mod_stats.erl +++ b/src/mod_stats.erl @@ -10,13 +10,14 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, +-export([start/1, process_local_iq/3]). -include("namespaces.hrl"). -start() -> - ejabberd_local:register_iq_handler(?NS_STATS, ?MODULE, process_local_iq). +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_STATS, + ?MODULE, process_local_iq, Type). process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> diff --git a/src/mod_time.erl b/src/mod_time.erl index 2820f6203..d2a6459d5 100644 --- a/src/mod_time.erl +++ b/src/mod_time.erl @@ -10,19 +10,16 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, +-export([start/1, process_local_iq/3]). -include("ejabberd.hrl"). -include("namespaces.hrl"). - - -start() -> - ejabberd_local:register_iq_handler(?NS_TIME, - ?MODULE, process_local_iq). - +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_TIME, + ?MODULE, process_local_iq, Type). process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 91f8904c2..f35302e46 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -10,7 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, init/0, +-export([start/1, init/0, process_local_iq/3, process_sm_iq/3, reindex_vcards/0]). @@ -35,7 +35,7 @@ -record(vcard, {user, vcard}). -start() -> +start(Type) -> mnesia:create_table(vcard, [{disc_only_copies, [node()]}, {attributes, record_info(fields, vcard)}]), mnesia:create_table(vcard_search, @@ -53,10 +53,10 @@ start() -> mnesia:add_table_index(vcard_search, lorgname), mnesia:add_table_index(vcard_search, lorgunit), - ejabberd_local:register_iq_handler(?NS_VCARD, - ?MODULE, process_local_iq), - ejabberd_sm:register_iq_handler(?NS_VCARD, - ?MODULE, process_sm_iq), + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VCARD, + ?MODULE, process_local_iq, Type), + gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_VCARD, + ?MODULE, process_sm_iq, Type), spawn(?MODULE, init, []). diff --git a/src/mod_version.erl b/src/mod_version.erl index c79b5fbbe..73b32b95c 100644 --- a/src/mod_version.erl +++ b/src/mod_version.erl @@ -10,7 +10,7 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([start/0, +-export([start/1, process_local_iq/3]). -include("ejabberd.hrl"). @@ -18,10 +18,9 @@ - -start() -> - ejabberd_local:register_iq_handler(?NS_VERSION, - ?MODULE, process_local_iq). +start(Type) -> + gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VERSION, + ?MODULE, process_local_iq, Type).