aboutsummaryrefslogtreecommitdiff
path: root/src/mod_adhoc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_adhoc.erl')
-rw-r--r--src/mod_adhoc.erl150
1 files changed, 68 insertions, 82 deletions
diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl
index e12e0de1e..5b582d82b 100644
--- a/src/mod_adhoc.erl
+++ b/src/mod_adhoc.erl
@@ -31,18 +31,15 @@
-behaviour(gen_mod).
--export([start/2, stop/1, process_local_iq/3,
- process_sm_iq/3, get_local_commands/5,
+-export([start/2, stop/1, process_local_iq/1,
+ process_sm_iq/1, 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, mod_opt_type/1, depends/2]).
-include("ejabberd.hrl").
-include("logger.hrl").
-
--include("jlib.hrl").
-
--include("adhoc.hrl").
+-include("xmpp.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1,
@@ -107,12 +104,9 @@ get_local_commands(Acc, _From,
{result, I} -> I;
_ -> []
end,
- Nodes = [#xmlel{name = <<"item">>,
- attrs =
- [{<<"jid">>, Server}, {<<"node">>, ?NS_COMMANDS},
- {<<"name">>,
- translate:translate(Lang, <<"Commands">>)}],
- children = []}],
+ Nodes = [#disco_item{jid = jid:make(Server),
+ node = ?NS_COMMANDS,
+ name = translate:translate(Lang, <<"Commands">>)}],
{result, Items ++ Nodes}
end;
get_local_commands(_Acc, From,
@@ -140,13 +134,9 @@ get_sm_commands(Acc, _From,
{result, I} -> I;
_ -> []
end,
- Nodes = [#xmlel{name = <<"item">>,
- attrs =
- [{<<"jid">>, jid:to_string(To)},
- {<<"node">>, ?NS_COMMANDS},
- {<<"name">>,
- translate:translate(Lang, <<"Commands">>)}],
- children = []}],
+ Nodes = [#disco_item{jid = To,
+ node = ?NS_COMMANDS,
+ name = translate:translate(Lang, <<"Commands">>)}],
{result, Items ++ Nodes}
end;
get_sm_commands(_Acc, From,
@@ -160,21 +150,14 @@ 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) ->
- [#xmlel{name = <<"identity">>,
- attrs =
- [{<<"category">>, <<"automation">>},
- {<<"type">>, <<"command-list">>},
- {<<"name">>,
- translate:translate(Lang, <<"Commands">>)}],
- children = []}
+ [#identity{category = <<"automation">>,
+ type = <<"command-list">>,
+ name = translate:translate(Lang, <<"Commands">>)}
| Acc];
get_local_identity(Acc, _From, _To, <<"ping">>, Lang) ->
- [#xmlel{name = <<"identity">>,
- attrs =
- [{<<"category">>, <<"automation">>},
- {<<"type">>, <<"command-node">>},
- {<<"name">>, translate:translate(Lang, <<"Ping">>)}],
- children = []}
+ [#identity{category = <<"automation">>,
+ type = <<"command-node">>,
+ name = translate:translate(Lang, <<"Ping">>)}
| Acc];
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
@@ -183,18 +166,16 @@ 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) ->
- [#xmlel{name = <<"identity">>,
- attrs =
- [{<<"category">>, <<"automation">>},
- {<<"type">>, <<"command-list">>},
- {<<"name">>,
- translate:translate(Lang, <<"Commands">>)}],
- children = []}
+ [#identity{category = <<"automation">>,
+ type = <<"command-list">>,
+ name = translate:translate(Lang, <<"Commands">>)}
| Acc];
get_sm_identity(Acc, _From, _To, _Node, _Lang) -> Acc.
%-------------------------------------------------------------------------
-
+-spec get_local_features({error, stanza_error()} | {result, [binary()]} | empty,
+ jid(), jid(), binary(), binary()) ->
+ {error, stanza_error()} | {result, [binary()]} | empty.
get_local_features(Acc, _From, _To, <<"">>, _Lang) ->
Feats = case Acc of
{result, I} -> I;
@@ -225,62 +206,67 @@ 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_local_iq(IQ) ->
+ process_adhoc_request(IQ, local).
-process_sm_iq(From, To, IQ) ->
- process_adhoc_request(From, To, IQ, adhoc_sm_commands).
+process_sm_iq(IQ) ->
+ process_adhoc_request(IQ, sm).
-process_adhoc_request(From, To,
- #iq{sub_el = SubEl, lang = Lang} = 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 ->
- Txt = <<"No hook has processed this command">>,
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERRT_ITEM_NOT_FOUND(Lang, Txt)]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]};
- Command -> IQ#iq{type = result, sub_el = [Command]}
- end
- end.
+process_adhoc_request(#iq{from = From, to = To,
+ type = set, lang = Lang,
+ sub_els = [#adhoc_command{} = SubEl]} = IQ, Type) ->
+ Host = To#jid.lserver,
+ Res = case Type of
+ local ->
+ ejabberd_hooks:run_fold(adhoc_local_commands, Host, empty,
+ [From, To, SubEl]);
+ sm ->
+ ejabberd_hooks:run_fold(adhoc_sm_commands, Host, empty,
+ [From, To, SubEl])
+ end,
+ case Res of
+ ignore ->
+ ignore;
+ empty ->
+ Txt = <<"No hook has processed this command">>,
+ xmpp:make_error(IQ, xmpp:err_item_not_found(Txt, Lang));
+ {error, Error} ->
+ xmpp:make_error(IQ, Error);
+ Command ->
+ xmpp:make_iq_result(IQ, Command)
+ end;
+process_adhoc_request(#iq{} = IQ, _Hooks) ->
+ xmpp:make_error(IQ, xmpp:err_bad_request()).
+-spec ping_item(empty | {error, stanza_error()} | {result, [disco_item()]},
+ jid(), jid(), binary()) -> {result, [disco_item()]}.
ping_item(Acc, _From, #jid{server = Server} = _To,
Lang) ->
Items = case Acc of
{result, I} -> I;
_ -> []
end,
- Nodes = [#xmlel{name = <<"item">>,
- attrs =
- [{<<"jid">>, Server}, {<<"node">>, <<"ping">>},
- {<<"name">>, translate:translate(Lang, <<"Ping">>)}],
- children = []}],
+ Nodes = [#disco_item{jid = jid:make(Server),
+ node = <<"ping">>,
+ name = translate:translate(Lang, <<"Ping">>)}],
{result, Items ++ Nodes}.
+-spec ping_command(adhoc_command(), jid(), jid(), adhoc_command()) ->
+ adhoc_command() | {error, stanza_error()}.
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">>)}]});
+ #adhoc_command{lang = Lang, node = <<"ping">>,
+ action = Action} = Request) ->
+ if Action == execute ->
+ xmpp_util:make_adhoc_response(
+ Request,
+ #adhoc_command{
+ status = completed,
+ notes = [#adhoc_note{
+ type = info,
+ data = translate:translate(Lang, <<"Pong">>)}]});
true ->
Txt = <<"Incorrect value of 'action' attribute">>,
- {error, ?ERRT_BAD_REQUEST(Lang, Txt)}
+ {error, xmpp:err_bad_request(Txt, Lang)}
end;
ping_command(Acc, _From, _To, _Request) -> Acc.