ejabberd_web:error(not_found).
host_up(Host) ->
- IQDisc = gen_iq_handler:iqdisc(Host),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_CAPTCHA,
- ?MODULE, process_iq, IQDisc).
+ ?MODULE, process_iq).
host_down(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_CAPTCHA).
-export([route/1, process_iq/1,
get_features/1,
- register_iq_handler/5,
+ register_iq_handler/4,
unregister_iq_handler/2,
bounce_resource_packet/1,
host_up/1, host_down/1]).
XMLNS = xmpp:get_ns(El),
Host = To#jid.lserver,
case ets:lookup(?IQTABLE, {Host, XMLNS}) of
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:handle(Host, Module, Function, Opts, Packet);
+ [{_, Module, Function}] ->
+ gen_iq_handler:handle(Host, Module, Function, Packet);
[] ->
Txt = <<"No module is handling this query">>,
Err = xmpp:err_service_unavailable(Txt, Lang),
route_iq(IQ, Fun, Timeout) ->
ejabberd_router:route_iq(IQ, Fun, undefined, Timeout).
--spec register_iq_handler(binary(), binary(), module(), function(),
- gen_iq_handler:opts()) -> ok.
-register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
+-spec register_iq_handler(binary(), binary(), module(), function()) -> ok.
+register_iq_handler(Host, XMLNS, Module, Fun) ->
gen_server:cast(?MODULE,
- {register_iq_handler, Host, XMLNS, Module, Fun, Opts}).
+ {register_iq_handler, Host, XMLNS, Module, Fun}).
-spec unregister_iq_handler(binary(), binary()) -> ok.
unregister_iq_handler(Host, XMLNS) ->
handle_call(_Request, _From, State) ->
Reply = ok, {reply, Reply, State}.
-handle_cast({register_iq_handler, Host, XMLNS, Module,
- Function, Opts},
+handle_cast({register_iq_handler, Host, XMLNS, Module, Function},
State) ->
ets:insert(?IQTABLE,
- {{Host, XMLNS}, Module, Function, Opts}),
+ {{Host, XMLNS}, Module, Function}),
{noreply, State};
handle_cast({unregister_iq_handler, Host, XMLNS},
State) ->
- case ets:lookup(?IQTABLE, {Host, XMLNS}) of
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:stop_iq_handler(Module, Function, Opts);
- _ -> ok
- end,
ets:delete(?IQTABLE, {Host, XMLNS}),
{noreply, State};
handle_cast(_Msg, State) -> {noreply, State}.
get_vh_session_list/1,
get_vh_session_number/1,
get_vh_by_backend/1,
- register_iq_handler/5,
+ register_iq_handler/4,
unregister_iq_handler/2,
force_update_presence/1,
connected_users/0,
Mod = get_sm_backend(LServer),
length(online(get_sessions(Mod, LServer))).
--spec register_iq_handler(binary(), binary(), atom(), atom(), list()) -> ok.
+-spec register_iq_handler(binary(), binary(), atom(), atom()) -> ok.
-register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
+register_iq_handler(Host, XMLNS, Module, Fun) ->
?GEN_SERVER:cast(?MODULE,
- {register_iq_handler, Host, XMLNS, Module, Fun, Opts}).
+ {register_iq_handler, Host, XMLNS, Module, Fun}).
-spec unregister_iq_handler(binary(), binary()) -> ok.
handle_call(_Request, _From, State) ->
Reply = ok, {reply, Reply, State}.
-handle_cast({register_iq_handler, Host, XMLNS, Module,
- Function, Opts},
+handle_cast({register_iq_handler, Host, XMLNS, Module, Function},
State) ->
ets:insert(sm_iqtable,
- {{Host, XMLNS}, Module, Function, Opts}),
+ {{Host, XMLNS}, Module, Function}),
{noreply, State};
handle_cast({unregister_iq_handler, Host, XMLNS},
State) ->
- case ets:lookup(sm_iqtable, {Host, XMLNS}) of
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:stop_iq_handler(Module, Function, Opts);
- _ -> ok
- end,
ets:delete(sm_iqtable, {Host, XMLNS}),
{noreply, State};
handle_cast(_Msg, State) -> {noreply, State}.
XMLNS = xmpp:get_ns(El),
Host = To#jid.lserver,
case ets:lookup(sm_iqtable, {Host, XMLNS}) of
- [{_, Module, Function, Opts}] ->
- gen_iq_handler:handle(Host, Module, Function, Opts, Packet);
+ [{_, Module, Function}] ->
+ gen_iq_handler:handle(Host, Module, Function, Packet);
[] ->
Txt = <<"No module is handling this query">>,
Err = xmpp:err_service_unavailable(Txt, Lang),
infinity,
supervisor,
[ejabberd_tmp_sup]},
- IQSupervisor =
- {ejabberd_iq_sup,
- {ejabberd_tmp_sup, start_link,
- [ejabberd_iq_sup, gen_iq_handler]},
- permanent,
- infinity,
- supervisor,
- [ejabberd_tmp_sup]},
BackendSupervisor = {ejabberd_backend_sup,
{ejabberd_backend_sup, start_link, []},
permanent, infinity, supervisor,
S2SInSupervisor,
S2SOutSupervisor,
ServiceSupervisor,
- IQSupervisor,
ACL,
Shaper,
BackendSupervisor,
-author('alexey@process-one.net').
--ifndef(GEN_SERVER).
--define(GEN_SERVER, gen_server).
--endif.
--behaviour(?GEN_SERVER).
-behaviour(ejabberd_config).
%% API
--export([start_link/3, add_iq_handler/6,
- remove_iq_handler/3, stop_iq_handler/3, handle/5,
+-export([add_iq_handler/5, remove_iq_handler/3, handle/4,
process_iq/4, check_type/1, transform_module_options/1,
- opt_type/1, iqdisc/1]).
-
-%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2,
- handle_info/2, terminate/2, code_change/3]).
+ opt_type/1]).
+%% Deprecated functions
+-export([add_iq_handler/6, handle/5, iqdisc/1]).
+-deprecated([{add_iq_handler, 6}, {handle, 5}, {iqdisc, 1}]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("xmpp.hrl").
--record(state, {host, module, function}).
-
-type component() :: ejabberd_sm | ejabberd_local.
--type type() :: no_queue | one_queue | pos_integer() | parallel.
--type opts() :: no_queue | {one_queue, pid()} | {queues, [pid()]} | parallel.
--export_type([opts/0, type/0]).
%%====================================================================
%% API
%%====================================================================
-%%--------------------------------------------------------------------
-%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
-%% Description: Starts the server
-%%--------------------------------------------------------------------
-start_link(Host, Module, Function) ->
- ?GEN_SERVER:start_link(?MODULE, [Host, Module, Function],
- []).
-
--spec add_iq_handler(module(), binary(), binary(), module(), atom(), type()) -> ok.
-
-add_iq_handler(Component, Host, NS, Module, Function,
- Type) ->
- case Type of
- no_queue ->
- Component:register_iq_handler(Host, NS, Module,
- Function, no_queue);
- one_queue ->
- {ok, Pid} = supervisor:start_child(ejabberd_iq_sup,
- [Host, Module, Function]),
- Component:register_iq_handler(Host, NS, Module,
- Function, {one_queue, Pid});
- N when is_integer(N) ->
- Pids = lists:map(fun (_) ->
- {ok, Pid} =
- supervisor:start_child(ejabberd_iq_sup,
- [Host, Module,
- Function]),
- Pid
- end,
- lists:seq(1, N)),
- Component:register_iq_handler(Host, NS, Module,
- Function, {queues, Pids});
- parallel ->
- Component:register_iq_handler(Host, NS, Module,
- Function, parallel)
- end.
+-spec add_iq_handler(module(), binary(), binary(), module(), atom()) -> ok.
+add_iq_handler(Component, Host, NS, Module, Function) ->
+ Component:register_iq_handler(Host, NS, Module, Function).
-spec remove_iq_handler(component(), binary(), binary()) -> ok.
-
remove_iq_handler(Component, Host, NS) ->
Component:unregister_iq_handler(Host, NS).
--spec stop_iq_handler(atom(), atom(), [pid()]) -> any().
-
-stop_iq_handler(_Module, _Function, Opts) ->
- case Opts of
- {one_queue, Pid} -> ?GEN_SERVER:call(Pid, stop);
- {queues, Pids} ->
- lists:foreach(fun (Pid) ->
- catch ?GEN_SERVER:call(Pid, stop)
- end,
- Pids);
- _ -> ok
- end.
-
--spec handle(binary(), atom(), atom(), opts(), iq()) -> any().
-
-handle(Host, Module, Function, Opts, IQ) ->
- case Opts of
- no_queue ->
- process_iq(Host, Module, Function, IQ);
- {one_queue, Pid} ->
- Pid ! {process_iq, IQ};
- {queues, Pids} ->
- Pid = lists:nth(erlang:phash(p1_time_compat:unique_integer(),
- length(Pids)), Pids),
- Pid ! {process_iq, IQ};
- parallel ->
- spawn(?MODULE, process_iq, [Host, Module, Function, IQ]);
- _ -> todo
- end.
+-spec handle(binary(), atom(), atom(), iq()) -> any().
+handle(Host, Module, Function, IQ) ->
+ process_iq(Host, Module, Function, IQ).
-spec process_iq(binary(), atom(), atom(), iq()) -> any().
-
process_iq(_Host, Module, Function, IQ) ->
try
ResIQ = case erlang:function_exported(Module, Function, 1) of
To, From)
end.
--spec check_type(type()) -> type().
+-spec check_type(any()) -> no_queue.
+check_type(_Type) ->
+ ?WARNING_MSG("Option 'iqdisc' is deprecated and has no effect anymore", []),
+ no_queue.
-check_type(no_queue) -> no_queue;
-check_type(one_queue) -> one_queue;
-check_type(N) when is_integer(N), N>0 -> N;
-check_type(parallel) -> parallel.
-
-iqdisc(Host) ->
- ejabberd_config:get_option({iqdisc, Host}, no_queue).
+-spec iqdisc(binary() | global) -> no_queue.
+iqdisc(_Host) ->
+ no_queue.
-spec transform_module_options([{atom(), any()}]) -> [{atom(), any()}].
Opt
end, Opts).
--spec opt_type(iqdisc) -> fun((type()) -> type());
+-spec opt_type(iqdisc) -> fun((any()) -> no_queue);
(atom()) -> [atom()].
opt_type(iqdisc) -> fun check_type/1;
opt_type(_) -> [iqdisc].
%%====================================================================
-%% gen_server callbacks
+%% Deprecated API
%%====================================================================
+-spec add_iq_handler(module(), binary(), binary(), module(), atom(), any()) -> ok.
+add_iq_handler(Component, Host, NS, Module, Function, _Type) ->
+ add_iq_handler(Component, Host, NS, Module, Function).
-init([Host, Module, Function]) ->
- {ok,
- #state{host = Host, module = Module,
- function = Function}}.
-
-handle_call(stop, _From, State) ->
- Reply = ok, {stop, normal, Reply, State}.
-
-handle_cast(_Msg, State) -> {noreply, State}.
-
-handle_info({process_iq, IQ},
- #state{host = Host, module = Module,
- function = Function} =
- State) ->
- process_iq(Host, Module, Function, IQ),
- {noreply, State};
-handle_info(_Info, State) -> {noreply, State}.
-
-terminate(_Reason, _State) -> ok.
-
-code_change(_OldVsn, State, _Extra) -> {ok, State}.
-
-%%--------------------------------------------------------------------
-%%% Internal functions
-%%--------------------------------------------------------------------
+-spec handle(binary(), atom(), atom(), any(), iq()) -> any().
+handle(Host, Module, Function, _Opts, IQ) ->
+ handle(Host, Module, Function, IQ).
-include("logger.hrl").
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_COMMANDS, ?MODULE, process_local_iq,
- IQDisc),
+ ?NS_COMMANDS, ?MODULE, process_local_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_COMMANDS, ?MODULE, process_sm_iq, IQDisc),
+ ?NS_COMMANDS, ?MODULE, process_sm_iq),
ejabberd_hooks:add(disco_local_identity, Host, ?MODULE,
get_local_identity, 99),
ejabberd_hooks:add(disco_local_features, Host, ?MODULE,
gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
?NS_COMMANDS).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_COMMANDS,
- ?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS,
- ?MODULE, process_sm_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
%-------------------------------------------------------------------------
depends(_Host, _Opts) ->
[].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(report_commands_node) ->
fun (B) when is_boolean(B) -> B end.
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {report_commands_node, false}].
+mod_options(_Host) ->
+ [{report_commands_node, false}].
-protocol({xep, 191, '1.2'}).
--export([start/2, stop/1, reload/3, process_iq/1, mod_opt_type/1, depends/2,
+-export([start/2, stop/1, reload/3, process_iq/1, depends/2,
disco_features/5, mod_options/1]).
-include("ejabberd.hrl").
-include("mod_privacy.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
ejabberd_hooks:add(disco_local_features, Host, ?MODULE, disco_features, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_BLOCKING, ?MODULE, process_iq, IQDisc).
+ ?NS_BLOCKING, ?MODULE, process_iq).
stop(Host) ->
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, disco_features, 50),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_BLOCKING).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_BLOCKING,
- ?MODULE, process_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
depends(_Host, _Opts) ->
[{mod_privacy, hard}].
Txt = <<"Database failure">>,
xmpp:make_error(IQ, xmpp:err_internal_server_error(Txt, Lang)).
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
-
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)}].
+mod_options(_Host) ->
+ [].
false.
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
ejabberd_hooks:add(disco_local_features, Host, ?MODULE, disco_features, 50),
Mod = gen_mod:ram_db_mod(Host, ?MODULE),
init_cache(Mod, Host, Opts),
%% why priority 89: to define clearly that we must run BEFORE mod_logdb hook (90)
ejabberd_hooks:add(user_send_packet,Host, ?MODULE, user_send_packet, 89),
ejabberd_hooks:add(user_receive_packet,Host, ?MODULE, user_receive_packet, 89),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_CARBONS_2, ?MODULE, iq_handler, IQDisc).
+ gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_CARBONS_2, ?MODULE, iq_handler).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_CARBONS_2),
ets_cache:new(?CARBONCOPY_CACHE, cache_opts(NewOpts));
false ->
ok
- end,
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_CARBONS_2,
- ?MODULE, iq_handler, IQDisc);
- true ->
- ok
end.
-spec disco_features({error, stanza_error()} | {result, [binary()]} | empty,
depends(_Host, _Opts) ->
[].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(ram_db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
mod_opt_type(O) when O == use_cache; O == cache_missed ->
fun(B) when is_boolean(B) -> B end;
end.
mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {ram_db_type, ejabberd_config:default_ram_db(Host, ?MODULE)},
+ [{ram_db_type, ejabberd_config:default_ram_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
{cache_missed, ejabberd_config:cache_missed(Host)},
reload(_Host, _NewOpts, _OldOpts) ->
ok.
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(namespaces) ->
fun(L) ->
lists:map(
end, L)
end.
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {namespaces, []}].
+mod_options(_Host) ->
+ [{namespaces, []}].
depends(_, _) ->
[].
sub_els = [#delegation{delegated = [#delegated{ns = NS}]}]},
Delegations = dict:store({NS, Type}, {Host, Info}, State#state.delegations),
gen_iq_handler:add_iq_handler(Type, State#state.server_host, NS,
- ?MODULE, Type, gen_iq_handler:iqdisc(Host)),
+ ?MODULE, Type),
ejabberd_router:route(Msg),
?INFO_MSG("Namespace '~s' is delegated to external component '~s'",
[NS, Host]),
-type items_acc() :: {error, stanza_error()} | {result, [disco_item()]} | empty.
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
?NS_DISCO_ITEMS, ?MODULE,
- process_local_iq_items, IQDisc),
+ process_local_iq_items),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
?NS_DISCO_INFO, ?MODULE,
- process_local_iq_info, IQDisc),
+ process_local_iq_info),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_DISCO_ITEMS, ?MODULE, process_sm_iq_items,
- IQDisc),
+ ?NS_DISCO_ITEMS, ?MODULE, process_sm_iq_items),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_DISCO_INFO, ?MODULE, process_sm_iq_info,
- IQDisc),
+ ?NS_DISCO_INFO, ?MODULE, process_sm_iq_info),
catch ets:new(disco_extra_domains,
[named_table, ordered_set, public,
{heir, erlang:group_leader(), none}]),
end, OldDomains -- NewDomains);
true ->
ok
- end,
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_DISCO_ITEMS, ?MODULE,
- process_local_iq_items, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_DISCO_INFO, ?MODULE,
- process_local_iq_info, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_DISCO_ITEMS, ?MODULE, process_sm_iq_items,
- IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_DISCO_INFO, ?MODULE, process_sm_iq_info,
- IQDisc);
- true ->
- ok
end.
-spec register_extra_domain(binary(), binary()) -> true.
mod_opt_type(extra_domains) ->
fun (Hs) -> [iolist_to_binary(H) || H <- Hs] end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(name) -> fun iolist_to_binary/1;
mod_opt_type(server_info) ->
fun (L) ->
L)
end.
-mod_options(Host) ->
+mod_options(_Host) ->
[{extra_domains, []},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{server_info, []},
{name, ?T("ejabberd")}].
catch ets:new(irc_connection,
[named_table, public,
{keypos, #irc_connection.jid_server_host}]),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
lists:foreach(
fun(MyHost) ->
- register_hooks(MyHost, IQDisc),
+ register_hooks(MyHost),
ejabberd_router:register_route(MyHost, Host)
end, MyHosts),
{ok,
handle_cast({reload, ServerHost, NewOpts, OldOpts}, State) ->
NewHosts = gen_mod:get_opt_hosts(ServerHost, NewOpts),
OldHosts = gen_mod:get_opt_hosts(ServerHost, OldOpts),
- NewIQDisc = gen_mod:get_opt(iqdisc, NewOpts),
- OldIQDisc = gen_mod:get_opt(iqdisc, OldOpts),
NewMod = gen_mod:db_mod(ServerHost, NewOpts, ?MODULE),
OldMod = gen_mod:db_mod(ServerHost, OldOpts, ?MODULE),
Access = gen_mod:get_opt(access, NewOpts),
true ->
ok
end,
- if (NewIQDisc /= OldIQDisc) ->
- lists:foreach(
- fun(NewHost) ->
- register_hooks(NewHost, NewIQDisc)
- end, NewHosts -- (NewHosts -- OldHosts));
- true ->
- ok
- end,
lists:foreach(
fun(NewHost) ->
ejabberd_router:register_route(NewHost, ServerHost),
- register_hooks(NewHost, NewIQDisc)
+ register_hooks(NewHost)
end, NewHosts -- OldHosts),
lists:foreach(
fun(OldHost) ->
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-register_hooks(Host, IQDisc) ->
+register_hooks(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO,
- ?MODULE, process_disco_info, IQDisc),
+ ?MODULE, process_disco_info),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS,
- ?MODULE, process_disco_items, IQDisc),
+ ?MODULE, process_disco_items),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_REGISTER,
- ?MODULE, process_register, IQDisc),
+ ?MODULE, process_register),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
- ?MODULE, process_vcard, IQDisc),
+ ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_COMMANDS,
- ?MODULE, process_command, IQDisc).
+ ?MODULE, process_command).
unregister_hooks(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO),
mod_opt_type(realname) ->
fun iolist_to_binary/1;
mod_opt_type(webirc_password) ->
- fun iolist_to_binary/1;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
+ fun iolist_to_binary/1.
mod_options(Host) ->
[{access, all},
{db_type, ejabberd_config:default_db(Host, ?MODULE)},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{default_encoding, <<"iso8859-15">>},
{host, <<"irc.@HOST@">>},
{hosts, []},
-optional_callbacks([use_cache/1, cache_nodes/1]).
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Mod, Host, Opts),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_LAST, ?MODULE, process_local_iq, IQDisc),
+ ?NS_LAST, ?MODULE, process_local_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_LAST, ?MODULE, process_sm_iq, IQDisc),
+ ?NS_LAST, ?MODULE, process_sm_iq),
ejabberd_hooks:add(privacy_check_packet, Host, ?MODULE,
privacy_check_packet, 30),
ejabberd_hooks:add(register_user, Host, ?MODULE,
true ->
ok
end,
- init_cache(NewMod, Host, NewOpts),
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_LAST,
- ?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_LAST,
- ?MODULE, process_sm_iq, IQDisc);
- true ->
- ok
- end.
+ init_cache(NewMod, Host, NewOpts).
%%%
%%% Uptime of ejabberd node
[].
mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(O) when O == cache_life_time; O == cache_size ->
fun (I) when is_integer(I), I > 0 -> I;
(infinity) -> infinity
fun (B) when is_boolean(B) -> B end.
mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {db_type, ejabberd_config:default_db(Host, ?MODULE)},
+ [{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
{cache_missed, ejabberd_config:cache_missed(Host)},
%%% API
%%%===================================================================
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Host, Opts),
- register_iq_handlers(Host, IQDisc),
+ register_iq_handlers(Host),
ejabberd_hooks:add(sm_receive_packet, Host, ?MODULE,
sm_receive_packet, 50),
ejabberd_hooks:add(user_receive_packet, Host, ?MODULE,
ok
end,
ets_cache:setopts(archive_prefs_cache, cache_opts(NewOpts)),
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- register_iq_handlers(Host, IQDisc);
- true ->
- ok
- end,
case gen_mod:is_equal_opt(assume_mam_usage, NewOpts, OldOpts) of
{false, true, _} ->
ejabberd_hooks:add(message_is_archived, Host, ?MODULE,
depends(_Host, _Opts) ->
[].
--spec register_iq_handlers(binary(), gen_iq_handler:type()) -> ok.
-register_iq_handlers(Host, IQDisc) ->
+-spec register_iq_handlers(binary()) -> ok.
+register_iq_handlers(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_TMP,
- ?MODULE, process_iq_v0_2, IQDisc),
+ ?MODULE, process_iq_v0_2),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_TMP,
- ?MODULE, process_iq_v0_2, IQDisc),
+ ?MODULE, process_iq_v0_2),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_0,
- ?MODULE, process_iq_v0_3, IQDisc),
+ ?MODULE, process_iq_v0_3),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_0, ?MODULE,
- process_iq_v0_3, IQDisc),
+ process_iq_v0_3),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_1,
- ?MODULE, process_iq_v0_3, IQDisc),
+ ?MODULE, process_iq_v0_3),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_1,
- ?MODULE, process_iq_v0_3, IQDisc),
+ ?MODULE, process_iq_v0_3),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_2,
- ?MODULE, process_iq_v0_3, IQDisc),
+ ?MODULE, process_iq_v0_3),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_2,
- ?MODULE, process_iq_v0_3, IQDisc).
+ ?MODULE, process_iq_v0_3).
-spec unregister_iq_handlers(binary()) -> ok.
unregister_iq_handlers(Host) ->
(never) -> never;
(roster) -> roster
end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(request_activates_archiving) ->
fun (B) when is_boolean(B) -> B end.
[{assume_mam_usage, false},
{default, never},
{request_activates_archiving, false},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
init([ServerHost, Opts]) ->
process_flag(trap_exit, true),
Hosts = gen_mod:get_opt_hosts(ServerHost, Opts),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
lists:foreach(
fun(Host) ->
ConfigTab = gen_mod:get_module_proc(Host, config),
ejabberd_hooks:add(disco_info, Host, ?MODULE, disco_info, 100),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
?NS_DISCO_ITEMS, mod_disco,
- process_local_iq_items, IQDisc),
+ process_local_iq_items),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
?NS_DISCO_INFO, mod_disco,
- process_local_iq_info, IQDisc),
+ process_local_iq_info),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_DISCO_ITEMS, mod_disco,
- process_local_iq_items, IQDisc),
+ process_local_iq_items),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_DISCO_INFO, mod_disco,
- process_local_iq_info, IQDisc),
+ process_local_iq_info),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_PUBSUB, mod_pubsub, iq_sm, IQDisc),
+ ?NS_PUBSUB, mod_pubsub, iq_sm),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_MIX_0, ?MODULE, process_iq, IQDisc),
+ ?NS_MIX_0, ?MODULE, process_iq),
ejabberd_router:register_route(Host, ServerHost)
end, Hosts),
{ok, #state{server_host = ServerHost, hosts = Hosts}}.
depends(_Host, _Opts) ->
[{mod_pubsub, hard}].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(host) -> fun iolist_to_binary/1;
mod_opt_type(hosts) ->
fun (L) -> lists:map(fun iolist_to_binary/1, L) end.
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {host, <<"mix.@HOST@">>},
+mod_options(_Host) ->
+ [{host, <<"mix.@HOST@">>},
{hosts, []}].
init([Host, Opts]) ->
process_flag(trap_exit, true),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
#state{access = Access, hosts = MyHosts,
history_size = HistorySize, queue_type = QueueType,
room_shaper = RoomShaper} = State = init_state(Host, Opts),
RMod:init(Host, [{hosts, MyHosts}|Opts]),
lists:foreach(
fun(MyHost) ->
- register_iq_handlers(MyHost, IQDisc),
+ register_iq_handlers(MyHost),
ejabberd_router:register_route(MyHost, Host),
load_permanent_rooms(MyHost, Host, Access, HistorySize,
RoomShaper, QueueType)
{reply, ok, State}.
handle_cast({reload, ServerHost, NewOpts, OldOpts}, #state{hosts = OldHosts}) ->
- NewIQDisc = gen_mod:get_opt(iqdisc, NewOpts),
- OldIQDisc = gen_mod:get_opt(iqdisc, OldOpts),
NewMod = gen_mod:db_mod(ServerHost, NewOpts, ?MODULE),
NewRMod = gen_mod:ram_db_mod(ServerHost, NewOpts, ?MODULE),
OldMod = gen_mod:db_mod(ServerHost, OldOpts, ?MODULE),
true ->
ok
end,
- if (NewIQDisc /= OldIQDisc) ->
- lists:foreach(
- fun(NewHost) ->
- register_iq_handlers(NewHost, NewIQDisc)
- end, NewHosts -- (NewHosts -- OldHosts));
- true ->
- ok
- end,
lists:foreach(
fun(NewHost) ->
ejabberd_router:register_route(NewHost, ServerHost),
- register_iq_handlers(NewHost, NewIQDisc)
+ register_iq_handlers(NewHost)
end, NewHosts -- OldHosts),
lists:foreach(
fun(OldHost) ->
max_rooms_discoitems = MaxRoomsDiscoItems,
room_shaper = RoomShaper}.
-register_iq_handlers(Host, IQDisc) ->
+register_iq_handlers(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_REGISTER,
- ?MODULE, process_register, IQDisc),
+ ?MODULE, process_register),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
- ?MODULE, process_vcard, IQDisc),
+ ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MUCSUB,
- ?MODULE, process_mucsub, IQDisc),
+ ?MODULE, process_mucsub),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MUC_UNIQUE,
- ?MODULE, process_muc_unique, IQDisc),
+ ?MODULE, process_muc_unique),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO,
- ?MODULE, process_disco_info, IQDisc),
+ ?MODULE, process_disco_info),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS,
- ?MODULE, process_disco_items, IQDisc).
+ ?MODULE, process_disco_items).
unregister_iq_handlers(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_REGISTER),
(participant) -> participant;
(visitor) -> visitor
end, L)
- end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
+ end.
mod_options(Host) ->
[{access, all},
{access_persistent, all},
{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{ram_db_type, ejabberd_config:default_ram_db(Host, ?MODULE)},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{history_size, 20},
{host, <<"conference.@HOST@">>},
{hosts, []},
start(Host, Opts) ->
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
ejabberd_hooks:add(offline_message_hook, Host, ?MODULE,
store_packet, 50),
ejabberd_hooks:add(c2s_self_presence, Host, ?MODULE, c2s_self_presence, 50),
ejabberd_hooks:add(webadmin_user_parse_query, Host,
?MODULE, webadmin_user_parse_query, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_FLEX_OFFLINE,
- ?MODULE, handle_offline_query, IQDisc).
+ ?MODULE, handle_offline_query).
stop(Host) ->
ejabberd_hooks:delete(offline_message_hook, Host,
NewMod:init(Host, NewOpts);
true ->
ok
- end,
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_FLEX_OFFLINE,
- ?MODULE, handle_offline_query, IQDisc);
- true ->
- ok
end.
-spec store_offline_msg(#offline_msg{}) -> ok | {error, full | any()}.
mod_opt_type(store_empty_body) ->
fun (V) when is_boolean(V) -> V;
(unless_chat_state) -> unless_chat_state
- end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
+ end.
mod_options(Host) ->
[{db_type, ejabberd_config:default_db(Host, ?MODULE)},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{access_max_user_messages, max_user_offline_messages},
{store_empty_body, unless_chat_state}].
init([Host, Opts]) ->
process_flag(trap_exit, true),
State = init_state(Host, Opts),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
- register_iq_handlers(Host, IQDisc),
+ register_iq_handlers(Host),
case State#state.send_pings of
true -> register_hooks(Host);
false -> ok
handle_call(_Req, _From, State) ->
{reply, {error, badarg}, State}.
-handle_cast({reload, Host, NewOpts, OldOpts},
+handle_cast({reload, Host, NewOpts, _OldOpts},
#state{timers = Timers} = OldState) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} -> register_iq_handlers(Host, IQDisc);
- true -> ok
- end,
NewState = init_state(Host, NewOpts),
case {NewState#state.send_pings, OldState#state.send_pings} of
{true, false} -> register_hooks(Host);
ejabberd_hooks:delete(user_send_packet, Host, ?MODULE,
user_send, 100).
-register_iq_handlers(Host, IQDisc) ->
+register_iq_handlers(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PING,
- ?MODULE, iq_ping, IQDisc),
+ ?MODULE, iq_ping),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_PING,
- ?MODULE, iq_ping, IQDisc).
+ ?MODULE, iq_ping).
unregister_iq_handlers(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_PING),
depends(_Host, _Opts) ->
[].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(ping_interval) ->
fun (I) when is_integer(I), I > 0 -> I end;
mod_opt_type(ping_ack_timeout) ->
(kill) -> kill
end.
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {ping_interval, 60},
+mod_options(_Host) ->
+ [{ping_interval, 60},
{ping_ack_timeout, undefined},
{send_pings, false},
{timeout_action, none}].
-optional_callbacks([use_cache/1, cache_nodes/1]).
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Mod, Host, Opts),
ejabberd_hooks:add(remove_user, Host, ?MODULE,
remove_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_PRIVACY, ?MODULE, process_iq, IQDisc).
+ ?NS_PRIVACY, ?MODULE, process_iq).
stop(Host) ->
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE,
true ->
ok
end,
- init_cache(NewMod, Host, NewOpts),
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY,
- ?MODULE, process_iq, IQDisc);
- true ->
- ok
- end.
+ init_cache(NewMod, Host, NewOpts).
-spec disco_features({error, stanza_error()} | {result, [binary()]} | empty,
jid(), jid(), binary(), binary()) ->
[].
mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(O) when O == cache_life_time; O == cache_size ->
fun (I) when is_integer(I), I > 0 -> I;
(infinity) -> infinity
fun (B) when is_boolean(B) -> B end.
mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {db_type, ejabberd_config:default_db(Host, ?MODULE)},
+ [{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
{cache_missed, ejabberd_config:cache_missed(Host)},
-optional_callbacks([use_cache/1, cache_nodes/1]).
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Mod, Host, Opts),
ejabberd_hooks:add(remove_user, Host, ?MODULE,
remove_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_PRIVATE, ?MODULE, process_sm_iq, IQDisc).
+ ?NS_PRIVATE, ?MODULE, process_sm_iq).
stop(Host) ->
ejabberd_hooks:delete(remove_user, Host, ?MODULE,
true ->
ok
end,
- init_cache(NewMod, Host, NewOpts),
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE,
- ?MODULE, process_sm_iq, IQDisc);
- true ->
- ok
- end.
+ init_cache(NewMod, Host, NewOpts).
-spec process_sm_iq(iq()) -> iq().
process_sm_iq(#iq{type = Type, lang = Lang,
[].
mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(O) when O == cache_life_time; O == cache_size ->
fun (I) when is_integer(I), I > 0 -> I;
(infinity) -> infinity
fun (B) when is_boolean(B) -> B end.
mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {db_type, ejabberd_config:default_db(Host, ?MODULE)},
+ [{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
{cache_missed, ejabberd_config:cache_missed(Host)},
end;
mod_opt_type(ram_db_type) ->
fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
-mod_opt_type(iqdisc) ->
- fun gen_iq_handler:check_type/1;
mod_opt_type(Opt) ->
mod_proxy65_stream:listen_opt_type(Opt).
mod_options(Host) ->
[{ram_db_type, ejabberd_config:default_ram_db(Host, ?MODULE)},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{access, all},
{host, <<"proxy.@HOST@">>},
{hosts, []},
init([Host, Opts]) ->
process_flag(trap_exit, true),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
MyHosts = gen_mod:get_opt_hosts(Host, Opts),
lists:foreach(
fun(MyHost) ->
gen_iq_handler:add_iq_handler(ejabberd_local, MyHost, ?NS_DISCO_INFO,
- ?MODULE, process_disco_info, IQDisc),
+ ?MODULE, process_disco_info),
gen_iq_handler:add_iq_handler(ejabberd_local, MyHost, ?NS_DISCO_ITEMS,
- ?MODULE, process_disco_items, IQDisc),
+ ?MODULE, process_disco_items),
gen_iq_handler:add_iq_handler(ejabberd_local, MyHost, ?NS_VCARD,
- ?MODULE, process_vcard, IQDisc),
+ ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(ejabberd_local, MyHost, ?NS_BYTESTREAMS,
- ?MODULE, process_bytestreams, IQDisc),
+ ?MODULE, process_bytestreams),
ejabberd_router:register_route(MyHost, Host)
end, MyHosts),
{ok, #state{myhosts = MyHosts}}.
handle_cast({reload, ServerHost, NewOpts, OldOpts}, State) ->
NewHosts = gen_mod:get_opt_hosts(ServerHost, NewOpts),
OldHosts = gen_mod:get_opt_hosts(ServerHost, OldOpts),
- NewIQDisc = gen_mod:get_opt(iqdisc, NewOpts),
- OldIQDisc = gen_mod:get_opt(iqdisc, OldOpts),
- if (NewIQDisc /= OldIQDisc) ->
- lists:foreach(
- fun(NewHost) ->
- register_handlers(NewHost, NewIQDisc)
- end, NewHosts -- (NewHosts -- OldHosts));
- true ->
- ok
- end,
lists:foreach(
fun(NewHost) ->
ejabberd_router:register_route(NewHost, ServerHost),
- register_handlers(NewHost, NewIQDisc)
+ register_handlers(NewHost)
end, NewHosts -- OldHosts),
lists:foreach(
fun(OldHost) ->
max_connections(ServerHost) ->
gen_mod:get_module_opt(ServerHost, mod_proxy65, max_connections).
-register_handlers(Host, IQDisc) ->
+register_handlers(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO,
- ?MODULE, process_disco_info, IQDisc),
+ ?MODULE, process_disco_info),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS,
- ?MODULE, process_disco_items, IQDisc),
+ ?MODULE, process_disco_items),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
- ?MODULE, process_vcard, IQDisc),
+ ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_BYTESTREAMS,
- ?MODULE, process_bytestreams, IQDisc).
+ ?MODULE, process_bytestreams).
unregister_handlers(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO),
Hosts = gen_mod:get_opt_hosts(ServerHost, Opts),
Access = gen_mod:get_opt(access_createnode, Opts),
PepOffline = gen_mod:get_opt(ignore_pep_from_offline, Opts),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
LastItemCache = gen_mod:get_opt(last_item_cache, Opts),
MaxItemsNode = gen_mod:get_opt(max_items_node, Opts),
MaxSubsNode = gen_mod:get_opt(max_subscriptions_node, Opts),
end
end, [Host, ServerHost]),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO,
- ?MODULE, process_disco_info, IQDisc),
+ ?MODULE, process_disco_info),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS,
- ?MODULE, process_disco_items, IQDisc),
+ ?MODULE, process_disco_items),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_PUBSUB,
- ?MODULE, process_pubsub, IQDisc),
+ ?MODULE, process_pubsub),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_PUBSUB_OWNER,
- ?MODULE, process_pubsub_owner, IQDisc),
+ ?MODULE, process_pubsub_owner),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
- ?MODULE, process_vcard, IQDisc),
+ ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_COMMANDS,
- ?MODULE, process_commands, IQDisc),
+ ?MODULE, process_commands),
Plugins
end, Hosts),
ejabberd_hooks:add(c2s_self_presence, ServerHost,
ejabberd_hooks:add(disco_sm_items, ServerHost,
?MODULE, disco_sm_items, 75),
gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
- ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
+ ?NS_PUBSUB, ?MODULE, iq_sm),
gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
- ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc);
+ ?NS_PUBSUB_OWNER, ?MODULE, iq_sm);
false ->
ok
end,
fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
mod_opt_type(ignore_pep_from_offline) ->
fun (A) when is_boolean(A) -> A end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(last_item_cache) ->
fun (A) when is_boolean(A) -> A end;
mod_opt_type(max_items_node) ->
{hosts, []},
{name, ?T("Publish-Subscribe")},
{ignore_pep_from_offline, true},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{last_item_cache, false},
{max_items_node, ?MAXITEMS},
{nodetree, ?STDTREE},
%%--------------------------------------------------------------------
-spec start(binary(), gen_mod:opts()) -> ok.
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Mod, Host, Opts),
- register_iq_handlers(Host, IQDisc),
+ register_iq_handlers(Host),
register_hooks(Host),
ejabberd_commands:register_commands(get_commands_spec()).
NewMod:init(Host, NewOpts);
true ->
ok
- end,
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- register_iq_handlers(Host, IQDisc);
- true ->
- ok
end.
-spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}].
(infinity) -> infinity
end;
mod_opt_type(O) when O == use_cache; O == cache_missed ->
- fun (B) when is_boolean(B) -> B end;
-mod_opt_type(iqdisc) ->
- fun gen_iq_handler:check_type/1.
+ fun (B) when is_boolean(B) -> B end.
mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {db_type, ejabberd_config:default_db(Host, ?MODULE)},
+ [{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
{cache_missed, ejabberd_config:cache_missed(Host)},
%%--------------------------------------------------------------------
%% IQ handlers.
%%--------------------------------------------------------------------
--spec register_iq_handlers(binary(), gen_iq_handler:type()) -> ok.
-register_iq_handlers(Host, IQDisc) ->
+-spec register_iq_handlers(binary()) -> ok.
+register_iq_handlers(Host) ->
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PUSH_0,
- ?MODULE, process_iq, IQDisc).
+ ?MODULE, process_iq).
-spec unregister_iq_handlers(binary()) -> ok.
unregister_iq_handlers(Host) ->
-include("logger.hrl").
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_REGISTER, ?MODULE, process_iq, IQDisc),
+ ?NS_REGISTER, ?MODULE, process_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_REGISTER, ?MODULE, process_iq, IQDisc),
+ ?NS_REGISTER, ?MODULE, process_iq),
ejabberd_hooks:add(c2s_pre_auth_features, Host, ?MODULE,
stream_feature_register, 50),
ejabberd_hooks:add(c2s_unauthenticated_packet, Host,
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host,
?NS_REGISTER).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_REGISTER,
- ?MODULE, process_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_REGISTER,
- ?MODULE, process_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
depends(_Host, _Opts) ->
[].
mod_opt_type(captcha_protected) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(ip_access) -> fun acl:access_rules_validator/1;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(password_strength) ->
fun (N) when is_number(N), N >= 0 -> N end;
mod_opt_type(registration_watchers) ->
mod_opt_type(redirect_url) ->
fun iolist_to_binary/1.
-mod_options(Host) ->
+mod_options(_Host) ->
[{access, all},
{access_from, none},
{access_remove, all},
{captcha_protected, false},
{ip_access, all},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{password_strength, 0},
{registration_watchers, []},
{redirect_url, <<"">>},
-optional_callbacks([use_cache/2, cache_nodes/1]).
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
Mod = gen_mod:db_mod(Host, Opts, ?MODULE),
Mod:init(Host, Opts),
init_cache(Mod, Host, Opts),
ejabberd_hooks:add(webadmin_user, Host, ?MODULE,
webadmin_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_ROSTER, ?MODULE, process_iq, IQDisc).
+ ?NS_ROSTER, ?MODULE, process_iq).
stop(Host) ->
ejabberd_hooks:delete(roster_get, Host, ?MODULE,
NewMod:init(Host, NewOpts);
true ->
ok
- end,
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_ROSTER,
- ?MODULE, process_iq, IQDisc);
- true ->
- ok
end.
depends(_Host, _Opts) ->
mod_opt_type(access) ->
fun acl:access_rules_validator/1;
mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(store_current_id) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(versioning) ->
[{access, all},
{store_current_id, false},
{versioning, false},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
-behaviour(gen_mod).
-export([start/2, stop/1, reload/3, process_local_iq/1,
- process_sm_iq/1, mod_opt_type/1, mod_options/1, depends/2]).
+ process_sm_iq/1, mod_options/1, depends/2]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_SIC_0,
- ?MODULE, process_local_iq, IQDisc),
+ ?MODULE, process_local_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_SIC_0,
- ?MODULE, process_sm_iq, IQDisc),
+ ?MODULE, process_sm_iq),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_SIC_1,
- ?MODULE, process_local_iq, IQDisc),
+ ?MODULE, process_local_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_SIC_1,
- ?MODULE, process_sm_iq, IQDisc).
+ ?MODULE, process_sm_iq).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_SIC_0),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_SIC_1),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_SIC_1).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_SIC_0,
- ?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_SIC_0,
- ?MODULE, process_sm_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_SIC_1,
- ?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_SIC_1,
- ?MODULE, process_sm_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
depends(_Host, _Opts) ->
[].
xmpp:make_error(IQ, xmpp:err_item_not_found(Txt, Lang))
end.
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
-
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)}].
+mod_options(_Host) ->
+ [].
-behaviour(gen_mod).
--export([start/2, stop/1, reload/3, process_iq/1, mod_opt_type/1,
+-export([start/2, stop/1, reload/3, process_iq/1,
mod_options/1, depends/2]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_STATS,
- ?MODULE, process_iq, IQDisc).
+ ?MODULE, process_iq).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_STATS).
_ -> search_running_node(SNode, Nodes)
end.
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
-
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)}].
+mod_options(_Host) ->
+ [].
-behaviour(gen_mod).
-export([start/2, stop/1, reload/3, process_local_iq/1,
- mod_opt_type/1, mod_options/1, depends/2]).
+ mod_options/1, depends/2]).
-include("ejabberd.hrl").
-include("logger.hrl").
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_TIME, ?MODULE, process_local_iq, IQDisc).
+ ?NS_TIME, ?MODULE, process_local_iq).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
?NS_TIME).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_TIME,
- ?MODULE, process_local_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
process_local_iq(#iq{type = set, lang = Lang} = IQ) ->
Txt = <<"Value 'set' of 'type' attribute is not allowed">>,
depends(_Host, _Opts) ->
[].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1.
-
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)}].
+mod_options(_Host) ->
+ [].
init_cache(Mod, Host, Opts),
ejabberd_hooks:add(remove_user, Host, ?MODULE,
remove_user, 50),
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_VCARD, ?MODULE, process_local_iq, IQDisc),
+ ?NS_VCARD, ?MODULE, process_local_iq),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
- ?NS_VCARD, ?MODULE, process_sm_iq, IQDisc),
+ ?NS_VCARD, ?MODULE, process_sm_iq),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE,
get_sm_features, 50),
ejabberd_hooks:add(vcard_iq_set, Host, ?MODULE, vcard_iq_set, 50),
ejabberd_hooks:add(
disco_local_identity, MyHost, ?MODULE, disco_identity, 100),
gen_iq_handler:add_iq_handler(
- ejabberd_local, MyHost, ?NS_SEARCH, ?MODULE, process_search, IQDisc),
+ ejabberd_local, MyHost, ?NS_SEARCH, ?MODULE, process_search),
gen_iq_handler:add_iq_handler(
- ejabberd_local, MyHost, ?NS_VCARD, ?MODULE, process_vcard, IQDisc),
+ ejabberd_local, MyHost, ?NS_VCARD, ?MODULE, process_vcard),
gen_iq_handler:add_iq_handler(
ejabberd_local, MyHost, ?NS_DISCO_ITEMS, mod_disco,
- process_local_iq_items, IQDisc),
+ process_local_iq_items),
gen_iq_handler:add_iq_handler(
ejabberd_local, MyHost, ?NS_DISCO_INFO, mod_disco,
- process_local_iq_info, IQDisc),
+ process_local_iq_info),
case Mod:is_search_supported(Host) of
false ->
?WARNING_MSG("vcard search functionality is "
mod_opt_type(host) -> fun iolist_to_binary/1;
mod_opt_type(hosts) ->
fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(matches) ->
fun (infinity) -> infinity;
(I) when is_integer(I), I > 0 -> I
{matches, 30},
{search, false},
{name, ?T("vCard User Search")},
- {iqdisc, gen_iq_handler:iqdisc(Host)},
{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{use_cache, ejabberd_config:use_cache(Host)},
{cache_size, ejabberd_config:cache_size(Host)},
-include("xmpp.hrl").
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_VERSION, ?MODULE, process_local_iq,
- IQDisc).
+ ?NS_VERSION, ?MODULE, process_local_iq).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
?NS_VERSION).
-reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts) of
- {false, IQDisc, _} ->
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VERSION,
- ?MODULE, process_local_iq, IQDisc);
- true ->
- ok
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
process_local_iq(#iq{type = set, lang = Lang} = IQ) ->
Txt = <<"Value 'set' of 'type' attribute is not allowed">>,
depends(_Host, _Opts) ->
[].
-mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
mod_opt_type(show_os) ->
fun (B) when is_boolean(B) -> B end.
-mod_options(Host) ->
- [{iqdisc, gen_iq_handler:iqdisc(Host)},
- {show_os, true}].
+mod_options(_Host) ->
+ [{show_os, true}].
%%%===================================================================
%%% API
%%%===================================================================
-start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
+start(Host, _Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_EVENT,
- ?MODULE, process_iq, IQDisc).
+ ?MODULE, process_iq).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?MODULE).
depends(_, _) ->
[].
+mod_options(_) ->
+ [].
+
%%%===================================================================
%%% Internal functions
%%%===================================================================
roster_mock0 = :moka.start(:mod_roster)
:moka.replace(roster_mock0, :gen_iq_handler, :add_iq_handler,
- fn (_module, _host, _ns, _m, _f, _iqdisc) ->
+ fn (_module, _host, _ns, _m, _f) ->
:ok
end)
{ejabberd_hooks, {add, N}}
when N == 4; N == 5 ->
analyze_run_fun(Form, Acc);
- {gen_iq_handler, {add_iq_handler, 6}} ->
+ {gen_iq_handler, {add_iq_handler, N}}
+ when N == 5; N == 6 ->
analyze_iq_handler(Form, Acc);
_ ->
Acc
end.
analyze_iq_handler(Form, State) ->
- [_Component, _Host, _NS, Module, Function, _IQDisc] =
+ [_Component, _Host, _NS, Module, Function|_] =
erl_syntax:application_arguments(Form),
Mod = module_name(Module, State),
Fun = atom_value(Function, State),