diff options
Diffstat (limited to 'src/mod_adhoc.erl')
-rw-r--r-- | src/mod_adhoc.erl | 351 |
1 files changed, 182 insertions, 169 deletions
diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl index 5c9039673..2eaf36840 100644 --- a/src/mod_adhoc.erl +++ b/src/mod_adhoc.erl @@ -25,129 +25,155 @@ %%%---------------------------------------------------------------------- -module(mod_adhoc). + -author('henoch@dtek.chalmers.se'). -behaviour(gen_mod). --export([start/2, - stop/1, - process_local_iq/3, - process_sm_iq/3, - get_local_commands/5, - get_local_identity/5, - get_local_features/5, - get_sm_commands/5, - get_sm_identity/5, - get_sm_features/5, - ping_item/4, - ping_command/4]). +-export([start/2, stop/1, process_local_iq/3, + process_sm_iq/3, get_local_commands/5, + get_local_identity/5, get_local_features/5, + get_sm_commands/5, get_sm_identity/5, get_sm_features/5, + ping_item/4, ping_command/4]). -include("ejabberd.hrl"). + -include("jlib.hrl"). + -include("adhoc.hrl"). start(Host, Opts) -> - IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), - - 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), - - ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, get_local_identity, 99), - ejabberd_hooks:add(disco_local_features, Host, ?MODULE, get_local_features, 99), - ejabberd_hooks:add(disco_local_items, Host, ?MODULE, get_local_commands, 99), - ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 99), - ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 99), - ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_commands, 99), - ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, ping_item, 100), - ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, ping_command, 100). + IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1, + one_queue), + 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), + ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, + get_local_identity, 99), + ejabberd_hooks:add(disco_local_features, Host, ?MODULE, + get_local_features, 99), + ejabberd_hooks:add(disco_local_items, Host, ?MODULE, + get_local_commands, 99), + ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, + get_sm_identity, 99), + ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, + get_sm_features, 99), + ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, + get_sm_commands, 99), + ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, + ping_item, 100), + ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, + ping_command, 100). stop(Host) -> - ejabberd_hooks:delete(adhoc_local_commands, Host, ?MODULE, ping_command, 100), - ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, ping_item, 100), - ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, get_sm_commands, 99), - ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 99), - ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, get_sm_identity, 99), - ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_commands, 99), - ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 99), - ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 99), - - gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS), - gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_COMMANDS). + ejabberd_hooks:delete(adhoc_local_commands, Host, + ?MODULE, ping_command, 100), + ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, + ping_item, 100), + ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, + get_sm_commands, 99), + ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, + get_sm_features, 99), + ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, + get_sm_identity, 99), + ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, + get_local_commands, 99), + ejabberd_hooks:delete(disco_local_features, Host, + ?MODULE, get_local_features, 99), + ejabberd_hooks:delete(disco_local_identity, Host, + ?MODULE, get_local_identity, 99), + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, + ?NS_COMMANDS), + gen_iq_handler:remove_iq_handler(ejabberd_local, Host, + ?NS_COMMANDS). %------------------------------------------------------------------------- -get_local_commands(Acc, _From, #jid{server = Server, lserver = LServer} = _To, "", Lang) -> - Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false), +get_local_commands(Acc, _From, + #jid{server = Server, lserver = LServer} = _To, <<"">>, + Lang) -> + Display = gen_mod:get_module_opt(LServer, ?MODULE, + report_commands_node, + fun(B) when is_boolean(B) -> B end, + false), case Display of - false -> - Acc; - _ -> - Items = case Acc of - {result, I} -> I; - _ -> [] - end, - Nodes = [{xmlelement, - "item", - [{"jid", Server}, - {"node", ?NS_COMMANDS}, - {"name", translate:translate(Lang, "Commands")}], - []}], - {result, Items ++ Nodes} + false -> Acc; + _ -> + Items = case Acc of + {result, I} -> I; + _ -> [] + end, + Nodes = [#xmlel{name = <<"item">>, + attrs = + [{<<"jid">>, Server}, {<<"node">>, ?NS_COMMANDS}, + {<<"name">>, + translate:translate(Lang, <<"Commands">>)}], + children = []}], + {result, Items ++ Nodes} end; - -get_local_commands(_Acc, From, #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) -> - ejabberd_hooks:run_fold(adhoc_local_items, LServer, {result, []}, [From, To, Lang]); - -get_local_commands(_Acc, _From, _To, "ping", _Lang) -> +get_local_commands(_Acc, From, + #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) -> + ejabberd_hooks:run_fold(adhoc_local_items, LServer, + {result, []}, [From, To, Lang]); +get_local_commands(_Acc, _From, _To, <<"ping">>, + _Lang) -> {result, []}; - get_local_commands(Acc, _From, _To, _Node, _Lang) -> Acc. %------------------------------------------------------------------------- -get_sm_commands(Acc, _From, #jid{lserver = LServer} = To, "", Lang) -> - Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false), +get_sm_commands(Acc, _From, + #jid{lserver = LServer} = To, <<"">>, Lang) -> + Display = gen_mod:get_module_opt(LServer, ?MODULE, + report_commands_node, + fun(B) when is_boolean(B) -> B end, + false), case Display of - false -> - Acc; - _ -> - Items = case Acc of - {result, I} -> I; - _ -> [] - end, - Nodes = [{xmlelement, - "item", - [{"jid", jlib:jid_to_string(To)}, - {"node", ?NS_COMMANDS}, - {"name", translate:translate(Lang, "Commands")}], - []}], - {result, Items ++ Nodes} + false -> Acc; + _ -> + Items = case Acc of + {result, I} -> I; + _ -> [] + end, + Nodes = [#xmlel{name = <<"item">>, + attrs = + [{<<"jid">>, jlib:jid_to_string(To)}, + {<<"node">>, ?NS_COMMANDS}, + {<<"name">>, + translate:translate(Lang, <<"Commands">>)}], + children = []}], + {result, Items ++ Nodes} end; - -get_sm_commands(_Acc, From, #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) -> - ejabberd_hooks:run_fold(adhoc_sm_items, LServer, {result, []}, [From, To, Lang]); - -get_sm_commands(Acc, _From, _To, _Node, _Lang) -> - Acc. +get_sm_commands(_Acc, From, + #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) -> + ejabberd_hooks:run_fold(adhoc_sm_items, LServer, + {result, []}, [From, To, Lang]); +get_sm_commands(Acc, _From, _To, _Node, _Lang) -> Acc. %------------------------------------------------------------------------- %% On disco info request to the ad-hoc node, return automation/command-list. -get_local_identity(Acc, _From, _To, ?NS_COMMANDS, Lang) -> - [{xmlelement, "identity", - [{"category", "automation"}, - {"type", "command-list"}, - {"name", translate:translate(Lang, "Commands")}], []} | Acc]; - -get_local_identity(Acc, _From, _To, "ping", Lang) -> - [{xmlelement, "identity", - [{"category", "automation"}, - {"type", "command-node"}, - {"name", translate:translate(Lang, "Ping")}], []} | Acc]; - +get_local_identity(Acc, _From, _To, ?NS_COMMANDS, + Lang) -> + [#xmlel{name = <<"identity">>, + attrs = + [{<<"category">>, <<"automation">>}, + {<<"type">>, <<"command-list">>}, + {<<"name">>, + translate:translate(Lang, <<"Commands">>)}], + children = []} + | Acc]; +get_local_identity(Acc, _From, _To, <<"ping">>, Lang) -> + [#xmlel{name = <<"identity">>, + attrs = + [{<<"category">>, <<"automation">>}, + {<<"type">>, <<"command-node">>}, + {<<"name">>, translate:translate(Lang, <<"Ping">>)}], + children = []} + | Acc]; get_local_identity(Acc, _From, _To, _Node, _Lang) -> Acc. @@ -155,113 +181,100 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) -> %% On disco info request to the ad-hoc node, return automation/command-list. get_sm_identity(Acc, _From, _To, ?NS_COMMANDS, Lang) -> - [{xmlelement, "identity", - [{"category", "automation"}, - {"type", "command-list"}, - {"name", translate:translate(Lang, "Commands")}], []} | Acc]; - -get_sm_identity(Acc, _From, _To, _Node, _Lang) -> - Acc. + [#xmlel{name = <<"identity">>, + attrs = + [{<<"category">>, <<"automation">>}, + {<<"type">>, <<"command-list">>}, + {<<"name">>, + translate:translate(Lang, <<"Commands">>)}], + children = []} + | Acc]; +get_sm_identity(Acc, _From, _To, _Node, _Lang) -> Acc. %------------------------------------------------------------------------- -get_local_features(Acc, _From, _To, "", _Lang) -> +get_local_features(Acc, _From, _To, <<"">>, _Lang) -> Feats = case Acc of - {result, I} -> I; - _ -> [] + {result, I} -> I; + _ -> [] end, {result, Feats ++ [?NS_COMMANDS]}; - -get_local_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) -> - %% override all lesser features... +get_local_features(_Acc, _From, _To, ?NS_COMMANDS, + _Lang) -> {result, []}; - -get_local_features(_Acc, _From, _To, "ping", _Lang) -> - %% override all lesser features... +get_local_features(_Acc, _From, _To, <<"ping">>, + _Lang) -> {result, [?NS_COMMANDS]}; - get_local_features(Acc, _From, _To, _Node, _Lang) -> Acc. %------------------------------------------------------------------------- -get_sm_features(Acc, _From, _To, "", _Lang) -> +get_sm_features(Acc, _From, _To, <<"">>, _Lang) -> Feats = case Acc of - {result, I} -> I; - _ -> [] + {result, I} -> I; + _ -> [] end, {result, Feats ++ [?NS_COMMANDS]}; - -get_sm_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) -> - %% override all lesser features... +get_sm_features(_Acc, _From, _To, ?NS_COMMANDS, + _Lang) -> {result, []}; - -get_sm_features(Acc, _From, _To, _Node, _Lang) -> - Acc. +get_sm_features(Acc, _From, _To, _Node, _Lang) -> Acc. %------------------------------------------------------------------------- process_local_iq(From, To, IQ) -> - process_adhoc_request(From, To, IQ, adhoc_local_commands). - + process_adhoc_request(From, To, IQ, + adhoc_local_commands). process_sm_iq(From, To, IQ) -> process_adhoc_request(From, To, IQ, adhoc_sm_commands). - -process_adhoc_request(From, To, #iq{sub_el = SubEl} = IQ, Hook) -> +process_adhoc_request(From, To, + #iq{sub_el = SubEl} = IQ, Hook) -> ?DEBUG("About to parse ~p...", [IQ]), case adhoc:parse_request(IQ) of - {error, Error} -> - IQ#iq{type = error, sub_el = [SubEl, Error]}; - #adhoc_request{} = AdhocRequest -> - Host = To#jid.lserver, - case ejabberd_hooks:run_fold(Hook, Host, empty, - [From, To, AdhocRequest]) of - ignore -> - ignore; - empty -> - IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]}; - {error, Error} -> - IQ#iq{type = error, sub_el = [SubEl, Error]}; - Command -> - IQ#iq{type = result, sub_el = [Command]} - end + {error, Error} -> + IQ#iq{type = error, sub_el = [SubEl, Error]}; + #adhoc_request{} = AdhocRequest -> + Host = To#jid.lserver, + case ejabberd_hooks:run_fold(Hook, Host, empty, + [From, To, AdhocRequest]) + of + ignore -> ignore; + empty -> + IQ#iq{type = error, + sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]}; + {error, Error} -> + IQ#iq{type = error, sub_el = [SubEl, Error]}; + Command -> IQ#iq{type = result, sub_el = [Command]} + end end. - -ping_item(Acc, _From, #jid{server = Server} = _To, Lang) -> +ping_item(Acc, _From, #jid{server = Server} = _To, + Lang) -> Items = case Acc of - {result, I} -> - I; - _ -> - [] + {result, I} -> I; + _ -> [] end, - Nodes = [{xmlelement, "item", - [{"jid", Server}, - {"node", "ping"}, - {"name", translate:translate(Lang, "Ping")}], - []}], + Nodes = [#xmlel{name = <<"item">>, + attrs = + [{<<"jid">>, Server}, {<<"node">>, <<"ping">>}, + {<<"name">>, translate:translate(Lang, <<"Ping">>)}], + children = []}], {result, Items ++ Nodes}. - ping_command(_Acc, _From, _To, - #adhoc_request{lang = Lang, - node = "ping", - sessionid = _Sessionid, - action = Action} = Request) -> - if - Action == ""; Action == "execute" -> - adhoc:produce_response( - Request, - #adhoc_response{status = completed, - notes = [{"info", translate:translate( - Lang, - "Pong")}]}); - true -> - {error, ?ERR_BAD_REQUEST} + #adhoc_request{lang = Lang, node = <<"ping">>, + sessionid = _Sessionid, action = Action} = + Request) -> + if Action == <<"">>; Action == <<"execute">> -> + adhoc:produce_response(Request, + #adhoc_response{status = completed, + notes = + [{<<"info">>, + translate:translate(Lang, + <<"Pong">>)}]}); + true -> {error, ?ERR_BAD_REQUEST} end; - -ping_command(Acc, _From, _To, _Request) -> - Acc. - +ping_command(Acc, _From, _To, _Request) -> Acc. |