aboutsummaryrefslogtreecommitdiff
path: root/src/mod_configure.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_configure.erl')
-rw-r--r--src/mod_configure.erl74
1 files changed, 53 insertions, 21 deletions
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index ebdfadeeb..3c3381d7b 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -119,8 +119,10 @@ depends(_Host, _Opts) ->
[<<"http:">>, <<"jabber.org">>, <<"protocol">>,
<<"admin">>, Sub]).
+-spec tokenize(binary()) -> [binary()].
tokenize(Node) -> str:tokens(Node, <<"/#">>).
+-spec get_sm_identity([identity()], jid(), jid(), binary(), binary()) -> [identity()].
get_sm_identity(Acc, _From, _To, Node, Lang) ->
case Node of
<<"config">> ->
@@ -128,6 +130,7 @@ get_sm_identity(Acc, _From, _To, Node, Lang) ->
_ -> Acc
end.
+-spec get_local_identity([identity()], jid(), jid(), binary(), binary()) -> [identity()].
get_local_identity(Acc, _From, _To, Node, Lang) ->
LNode = tokenize(Node),
case LNode of
@@ -190,6 +193,8 @@ get_local_identity(Acc, _From, _To, Node, Lang) ->
allow -> {result, Feats}
end).
+-spec get_sm_features(mod_disco:features_acc(), jid(), jid(),
+ binary(), binary()) -> mod_disco:features_acc().
get_sm_features(Acc, From,
#jid{lserver = LServer} = _To, Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
@@ -202,6 +207,8 @@ get_sm_features(Acc, From,
end
end.
+-spec get_local_features(mod_disco:features_acc(), jid(), jid(),
+ binary(), binary()) -> mod_disco:features_acc().
get_local_features(Acc, From,
#jid{lserver = LServer} = _To, Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
@@ -264,10 +271,8 @@ get_local_features(Acc, From,
end.
%%%-----------------------------------------------------------------------
--spec adhoc_sm_items(empty | {error, stanza_error()} | {result, [disco_item()]},
- jid(), jid(), binary()) -> {error, stanza_error()} |
- {result, [disco_item()]} |
- empty.
+-spec adhoc_sm_items(mod_disco:items_acc(),
+ jid(), jid(), binary()) -> mod_disco:items_acc().
adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To,
Lang) ->
case acl:match_rule(LServer, configure, From) of
@@ -283,7 +288,8 @@ adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To,
end.
%%%-----------------------------------------------------------------------
-
+-spec get_sm_items(mod_disco:items_acc(), jid(), jid(),
+ binary(), binary()) -> mod_disco:items_acc().
get_sm_items(Acc, From,
#jid{user = User, server = Server, lserver = LServer} =
To,
@@ -309,6 +315,7 @@ get_sm_items(Acc, From,
end
end.
+-spec get_user_resources(binary(), binary()) -> [disco_item()].
get_user_resources(User, Server) ->
Rs = ejabberd_sm:get_user_resources(User, Server),
lists:map(fun (R) ->
@@ -319,10 +326,8 @@ get_user_resources(User, Server) ->
%%%-----------------------------------------------------------------------
--spec adhoc_local_items(empty | {error, stanza_error()} | {result, [disco_item()]},
- jid(), jid(), binary()) -> {error, stanza_error()} |
- {result, [disco_item()]} |
- empty.
+-spec adhoc_local_items(mod_disco:items_acc(),
+ jid(), jid(), binary()) -> mod_disco:items_acc().
adhoc_local_items(Acc, From,
#jid{lserver = LServer, server = Server} = To, Lang) ->
case acl:match_rule(LServer, configure, From) of
@@ -336,7 +341,7 @@ adhoc_local_items(Acc, From,
<<"">>, Server, Lang),
Nodes1 = lists:filter(
fun (#disco_item{node = Nd}) ->
- F = get_local_features([], From, To, Nd, Lang),
+ F = get_local_features(empty, From, To, Nd, Lang),
case F of
{result, [?NS_COMMANDS]} -> true;
_ -> false
@@ -347,6 +352,8 @@ adhoc_local_items(Acc, From,
_ -> Acc
end.
+-spec recursively_get_local_items(global | vhost, binary(), binary(),
+ binary(), binary()) -> [disco_item()].
recursively_get_local_items(_PermLev, _LServer,
<<"online users">>, _Server, _Lang) ->
[];
@@ -376,6 +383,7 @@ recursively_get_local_items(PermLev, LServer, Node,
end,
Items)).
+-spec get_permission_level(jid()) -> global | vhost.
get_permission_level(JID) ->
case acl:match_rule(global, configure, JID) of
allow -> global;
@@ -397,6 +405,8 @@ get_permission_level(JID) ->
end
end).
+-spec get_local_items(mod_disco:items_acc(), jid(), jid(),
+ binary(), binary()) -> mod_disco:items_acc().
get_local_items(Acc, From, #jid{lserver = LServer} = To,
<<"">>, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
@@ -489,10 +499,8 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To,
end.
%%%-----------------------------------------------------------------------
-
-%% @spec ({PermissionLevel, Host}, [string()], Server::string(), Lang)
-%% -> {result, [xmlelement()]}
-%% PermissionLevel = global | vhost
+-spec get_local_items({global | vhost, binary()}, [binary()],
+ binary(), binary()) -> {result, [disco_item()]} | {error, stanza_error()}.
get_local_items(_Host, [], Server, Lang) ->
{result,
[?NODE(?T("Configuration"), <<"config">>),
@@ -550,7 +558,7 @@ get_local_items({_, Host},
name = <<U/binary, $@, S/binary>>}
end, Sub)}
catch _:_ ->
- xmpp:err_not_acceptable()
+ {error, xmpp:err_not_acceptable()}
end;
get_local_items({_, Host}, [<<"outgoing s2s">>],
_Server, Lang) ->
@@ -638,6 +646,7 @@ get_local_items(_Host,
get_local_items(_Host, _, _Server, _Lang) ->
{error, xmpp:err_item_not_found()}.
+-spec get_online_vh_users(binary()) -> [disco_item()].
get_online_vh_users(Host) ->
case catch ejabberd_sm:get_vh_session_list(Host) of
{'EXIT', _Reason} -> [];
@@ -650,6 +659,7 @@ get_online_vh_users(Host) ->
end, SURs)
end.
+-spec get_all_vh_users(binary()) -> [disco_item()].
get_all_vh_users(Host) ->
case catch ejabberd_auth:get_users(Host)
of
@@ -686,6 +696,7 @@ get_all_vh_users(Host) ->
end
end.
+-spec get_outgoing_s2s(binary(), binary()) -> [disco_item()].
get_outgoing_s2s(Host, Lang) ->
case catch ejabberd_s2s:dirty_get_connections() of
{'EXIT', _Reason} -> [];
@@ -703,6 +714,7 @@ get_outgoing_s2s(Host, Lang) ->
end, lists:usort(TConns))
end.
+-spec get_outgoing_s2s(binary(), binary(), binary()) -> [disco_item()].
get_outgoing_s2s(Host, Lang, To) ->
case catch ejabberd_s2s:dirty_get_connections() of
{'EXIT', _Reason} -> [];
@@ -719,6 +731,7 @@ get_outgoing_s2s(Host, Lang, To) ->
Connections)))
end.
+-spec get_running_nodes(binary(), binary()) -> [disco_item()].
get_running_nodes(Server, _Lang) ->
case catch mnesia:system_info(running_db_nodes) of
{'EXIT', _Reason} -> [];
@@ -733,6 +746,7 @@ get_running_nodes(Server, _Lang) ->
lists:sort(DBNodes))
end.
+-spec get_stopped_nodes(binary()) -> [disco_item()].
get_stopped_nodes(_Lang) ->
case catch lists:usort(mnesia:system_info(db_nodes) ++
mnesia:system_info(extra_db_nodes))
@@ -785,6 +799,7 @@ adhoc_local_commands(Acc, From,
_ -> Acc
end.
+-spec adhoc_local_commands(jid(), jid(), adhoc_command()) -> adhoc_command() | {error, stanza_error()}.
adhoc_local_commands(From,
#jid{lserver = LServer} = _To,
#adhoc_command{lang = Lang, node = Node,
@@ -852,6 +867,9 @@ adhoc_local_commands(From,
#xdata_option{label = tr(Lang, ?T("Remote copy")),
value = <<"unknown">>}]}).
+-spec get_form(binary(), [binary()], binary()) -> {result, xdata()} |
+ {result, completed, xdata()} |
+ {error, stanza_error()}.
get_form(_Host, [<<"running nodes">>, ENode, <<"DB">>],
Lang) ->
case search_running_node(ENode) of
@@ -1169,6 +1187,8 @@ get_form(Host, ?NS_ADMINL(<<"get-online-users-num">>),
get_form(_Host, _, _Lang) ->
{error, xmpp:err_service_unavailable()}.
+-spec set_form(jid(), binary(), [binary()], binary(), xdata()) -> {result, xdata() | undefined} |
+ {error, stanza_error()}.
set_form(_From, _Host,
[<<"running nodes">>, ENode, <<"DB">>], Lang, XData) ->
case search_running_node(ENode) of
@@ -1543,22 +1563,28 @@ set_form(From, Host, ?NS_ADMINL(<<"user-stats">>), Lang,
set_form(_From, _Host, _, _Lang, _XData) ->
{error, xmpp:err_service_unavailable()}.
-get_value(Field, XData) -> hd(get_values(Field, XData)).
+-spec get_value(binary(), xdata()) -> binary().
+get_value(Field, XData) ->
+ hd(get_values(Field, XData)).
+-spec get_values(binary(), xdata()) -> [binary()].
get_values(Field, XData) ->
xmpp_util:get_xdata_values(Field, XData).
+-spec search_running_node(binary()) -> false | node().
search_running_node(SNode) ->
search_running_node(SNode,
mnesia:system_info(running_db_nodes)).
+-spec search_running_node(binary(), [node()]) -> false | node().
search_running_node(_, []) -> false;
search_running_node(SNode, [Node | Nodes]) ->
- case iolist_to_binary(atom_to_list(Node)) of
- SNode -> Node;
- _ -> search_running_node(SNode, Nodes)
+ case atom_to_binary(Node, utf8) of
+ SNode -> Node;
+ _ -> search_running_node(SNode, Nodes)
end.
+-spec stop_node(jid(), binary(), binary(), restart | stop, xdata()) -> {result, undefined}.
stop_node(From, Host, ENode, Action, XData) ->
Delay = binary_to_integer(get_value(<<"delay">>, XData)),
Subject = case get_value(<<"subject">>, XData) of
@@ -1586,9 +1612,10 @@ stop_node(From, Host, ENode, Action, XData) ->
end,
Time = timer:seconds(Delay),
Node = misc:binary_to_atom(ENode),
- {ok, _} = timer:apply_after(Time, rpc, call, [Node, init, Action, []]),
+ {ok, _} = timer:apply_after(Time, ejabberd_cluster, call, [Node, init, Action, []]),
{result, undefined}.
+-spec get_last_info(binary(), binary()) -> {ok, non_neg_integer(), binary()} | not_found.
get_last_info(User, Server) ->
case gen_mod:is_loaded(Server, mod_last) of
true -> mod_last:get_last_info(User, Server);
@@ -1596,7 +1623,8 @@ get_last_info(User, Server) ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec adhoc_sm_commands(adhoc_command(), jid(), jid(), adhoc_command()) -> adhoc_command().
+-spec adhoc_sm_commands(adhoc_command(), jid(), jid(), adhoc_command()) -> adhoc_command() |
+ {error, stanza_error()}.
adhoc_sm_commands(_Acc, From,
#jid{user = User, server = Server, lserver = LServer},
#adhoc_command{lang = Lang, node = <<"config">>,
@@ -1627,6 +1655,8 @@ adhoc_sm_commands(_Acc, From,
end;
adhoc_sm_commands(Acc, _From, _To, _Request) -> Acc.
+-spec get_sm_form(binary(), binary(), binary(), binary()) -> {result, xdata()} |
+ {error, stanza_error()}.
get_sm_form(User, Server, <<"config">>, Lang) ->
{result,
#xdata{type = form,
@@ -1650,6 +1680,8 @@ get_sm_form(User, Server, <<"config">>, Lang) ->
get_sm_form(_User, _Server, _Node, _Lang) ->
{error, xmpp:err_service_unavailable()}.
+-spec set_sm_form(binary(), binary(), binary(), adhoc_command()) -> adhoc_command() |
+ {error, stanza_error()}.
set_sm_form(User, Server, <<"config">>,
#adhoc_command{lang = Lang, node = Node,
sid = SessionID, xdata = XData}) ->