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.erl534
1 files changed, 228 insertions, 306 deletions
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index 36ea75141..3c3381d7b 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -41,10 +41,9 @@
-include("logger.hrl").
-include("xmpp.hrl").
-include("ejabberd_sm.hrl").
+-include("translate.hrl").
-include_lib("stdlib/include/ms_transform.hrl").
--define(T(Lang, Text), translate:translate(Lang, Text)).
-
start(Host, _Opts) ->
ejabberd_hooks:add(disco_local_items, Host, ?MODULE,
get_local_items, 50),
@@ -99,19 +98,19 @@ depends(_Host, _Opts) ->
%%%-----------------------------------------------------------------------
-define(INFO_IDENTITY(Category, Type, Name, Lang),
- [#identity{category = Category, type = Type, name = ?T(Lang, Name)}]).
+ [#identity{category = Category, type = Type, name = tr(Lang, Name)}]).
-define(INFO_COMMAND(Name, Lang),
?INFO_IDENTITY(<<"automation">>, <<"command-node">>,
Name, Lang)).
-define(NODEJID(To, Name, Node),
- #disco_item{jid = To, name = ?T(Lang, Name), node = Node}).
+ #disco_item{jid = To, name = tr(Lang, Name), node = Node}).
-define(NODE(Name, Node),
#disco_item{jid = jid:make(Server),
node = Node,
- name = ?T(Lang, Name)}).
+ name = tr(Lang, Name)}).
-define(NS_ADMINX(Sub),
<<(?NS_ADMIN)/binary, "#", Sub/binary>>).
@@ -120,70 +119,69 @@ 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">> ->
- ?INFO_COMMAND(<<"Configuration">>, Lang);
+ ?INFO_COMMAND(?T("Configuration"), 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
[<<"running nodes">>, ENode] ->
?INFO_IDENTITY(<<"ejabberd">>, <<"node">>, ENode, Lang);
[<<"running nodes">>, _ENode, <<"DB">>] ->
- ?INFO_COMMAND(<<"Database">>, Lang);
+ ?INFO_COMMAND(?T("Database"), Lang);
[<<"running nodes">>, _ENode, <<"modules">>,
<<"start">>] ->
- ?INFO_COMMAND(<<"Start Modules">>, Lang);
+ ?INFO_COMMAND(?T("Start Modules"), Lang);
[<<"running nodes">>, _ENode, <<"modules">>,
<<"stop">>] ->
- ?INFO_COMMAND(<<"Stop Modules">>, Lang);
+ ?INFO_COMMAND(?T("Stop Modules"), Lang);
[<<"running nodes">>, _ENode, <<"backup">>,
<<"backup">>] ->
- ?INFO_COMMAND(<<"Backup">>, Lang);
+ ?INFO_COMMAND(?T("Backup"), Lang);
[<<"running nodes">>, _ENode, <<"backup">>,
<<"restore">>] ->
- ?INFO_COMMAND(<<"Restore">>, Lang);
+ ?INFO_COMMAND(?T("Restore"), Lang);
[<<"running nodes">>, _ENode, <<"backup">>,
<<"textfile">>] ->
- ?INFO_COMMAND(<<"Dump to Text File">>, Lang);
+ ?INFO_COMMAND(?T("Dump to Text File"), Lang);
[<<"running nodes">>, _ENode, <<"import">>,
<<"file">>] ->
- ?INFO_COMMAND(<<"Import File">>, Lang);
+ ?INFO_COMMAND(?T("Import File"), Lang);
[<<"running nodes">>, _ENode, <<"import">>,
<<"dir">>] ->
- ?INFO_COMMAND(<<"Import Directory">>, Lang);
+ ?INFO_COMMAND(?T("Import Directory"), Lang);
[<<"running nodes">>, _ENode, <<"restart">>] ->
- ?INFO_COMMAND(<<"Restart Service">>, Lang);
+ ?INFO_COMMAND(?T("Restart Service"), Lang);
[<<"running nodes">>, _ENode, <<"shutdown">>] ->
- ?INFO_COMMAND(<<"Shut Down Service">>, Lang);
+ ?INFO_COMMAND(?T("Shut Down Service"), Lang);
?NS_ADMINL(<<"add-user">>) ->
- ?INFO_COMMAND(<<"Add User">>, Lang);
+ ?INFO_COMMAND(?T("Add User"), Lang);
?NS_ADMINL(<<"delete-user">>) ->
- ?INFO_COMMAND(<<"Delete User">>, Lang);
+ ?INFO_COMMAND(?T("Delete User"), Lang);
?NS_ADMINL(<<"end-user-session">>) ->
- ?INFO_COMMAND(<<"End User Session">>, Lang);
+ ?INFO_COMMAND(?T("End User Session"), Lang);
?NS_ADMINL(<<"get-user-password">>) ->
- ?INFO_COMMAND(<<"Get User Password">>, Lang);
+ ?INFO_COMMAND(?T("Get User Password"), Lang);
?NS_ADMINL(<<"change-user-password">>) ->
- ?INFO_COMMAND(<<"Change User Password">>, Lang);
+ ?INFO_COMMAND(?T("Change User Password"), Lang);
?NS_ADMINL(<<"get-user-lastlogin">>) ->
- ?INFO_COMMAND(<<"Get User Last Login Time">>, Lang);
+ ?INFO_COMMAND(?T("Get User Last Login Time"), Lang);
?NS_ADMINL(<<"user-stats">>) ->
- ?INFO_COMMAND(<<"Get User Statistics">>, Lang);
+ ?INFO_COMMAND(?T("Get User Statistics"), Lang);
?NS_ADMINL(<<"get-registered-users-num">>) ->
- ?INFO_COMMAND(<<"Get Number of Registered Users">>,
+ ?INFO_COMMAND(?T("Get Number of Registered Users"),
Lang);
?NS_ADMINL(<<"get-online-users-num">>) ->
- ?INFO_COMMAND(<<"Get Number of Online Users">>, Lang);
- [<<"config">>, <<"acls">>] ->
- ?INFO_COMMAND(<<"Access Control Lists">>, Lang);
- [<<"config">>, <<"access">>] ->
- ?INFO_COMMAND(<<"Access Rules">>, Lang);
+ ?INFO_COMMAND(?T("Get Number of Online Users"), Lang);
_ -> Acc
end.
@@ -191,10 +189,12 @@ get_local_identity(Acc, _From, _To, Node, Lang) ->
-define(INFO_RESULT(Allow, Feats, Lang),
case Allow of
- deny -> {error, xmpp:err_forbidden(<<"Access denied by service policy">>, Lang)};
+ deny -> {error, xmpp:err_forbidden(?T("Access denied by service policy"), 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
@@ -207,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
@@ -269,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
@@ -282,13 +282,14 @@ adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To,
empty -> []
end,
Nodes = [#disco_item{jid = To, node = <<"config">>,
- name = ?T(Lang, <<"Configuration">>)}],
+ name = tr(Lang, ?T("Configuration"))}],
{result, Items ++ Nodes};
_ -> Acc
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,
@@ -302,18 +303,19 @@ get_sm_items(Acc, From,
end,
case {acl:match_rule(LServer, configure, From), Node} of
{allow, <<"">>} ->
- Nodes = [?NODEJID(To, <<"Configuration">>,
+ Nodes = [?NODEJID(To, ?T("Configuration"),
<<"config">>),
- ?NODEJID(To, <<"User Management">>, <<"user">>)],
+ ?NODEJID(To, ?T("User Management"), <<"user">>)],
{result,
Items ++ Nodes ++ get_user_resources(User, Server)};
{allow, <<"config">>} -> {result, []};
{_, <<"config">>} ->
- {error, xmpp:err_forbidden(<<"Access denied by service policy">>, Lang)};
+ {error, xmpp:err_forbidden(?T("Access denied by service policy"), Lang)};
_ -> Acc
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) ->
@@ -324,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
@@ -341,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
@@ -352,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) ->
[];
@@ -381,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;
@@ -402,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
@@ -431,7 +436,7 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To,
_ ->
LNode = tokenize(Node),
Allow = acl:match_rule(LServer, configure, From),
- Err = xmpp:err_forbidden(<<"Access denied by service policy">>, Lang),
+ Err = xmpp:err_forbidden(?T("Access denied by service policy"), Lang),
case LNode of
[<<"config">>] ->
?ITEMS_RESULT(Allow, LNode, {error, Err});
@@ -494,45 +499,39 @@ 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(<<"Configuration">>, <<"config">>),
- ?NODE(<<"User Management">>, <<"user">>),
- ?NODE(<<"Online Users">>, <<"online users">>),
- ?NODE(<<"All Users">>, <<"all users">>),
- ?NODE(<<"Outgoing s2s Connections">>,
+ [?NODE(?T("Configuration"), <<"config">>),
+ ?NODE(?T("User Management"), <<"user">>),
+ ?NODE(?T("Online Users"), <<"online users">>),
+ ?NODE(?T("All Users"), <<"all users">>),
+ ?NODE(?T("Outgoing s2s Connections"),
<<"outgoing s2s">>),
- ?NODE(<<"Running Nodes">>, <<"running nodes">>),
- ?NODE(<<"Stopped Nodes">>, <<"stopped nodes">>)]};
-get_local_items(_Host, [<<"config">>], Server, Lang) ->
- {result,
- [?NODE(<<"Access Control Lists">>, <<"config/acls">>),
- ?NODE(<<"Access Rules">>, <<"config/access">>)]};
+ ?NODE(?T("Running Nodes"), <<"running nodes">>),
+ ?NODE(?T("Stopped Nodes"), <<"stopped nodes">>)]};
get_local_items(_Host, [<<"config">>, _], _Server,
_Lang) ->
{result, []};
get_local_items(_Host, [<<"user">>], Server, Lang) ->
{result,
- [?NODE(<<"Add User">>, (?NS_ADMINX(<<"add-user">>))),
- ?NODE(<<"Delete User">>,
+ [?NODE(?T("Add User"), (?NS_ADMINX(<<"add-user">>))),
+ ?NODE(?T("Delete User"),
(?NS_ADMINX(<<"delete-user">>))),
- ?NODE(<<"End User Session">>,
+ ?NODE(?T("End User Session"),
(?NS_ADMINX(<<"end-user-session">>))),
- ?NODE(<<"Get User Password">>,
+ ?NODE(?T("Get User Password"),
(?NS_ADMINX(<<"get-user-password">>))),
- ?NODE(<<"Change User Password">>,
+ ?NODE(?T("Change User Password"),
(?NS_ADMINX(<<"change-user-password">>))),
- ?NODE(<<"Get User Last Login Time">>,
+ ?NODE(?T("Get User Last Login Time"),
(?NS_ADMINX(<<"get-user-lastlogin">>))),
- ?NODE(<<"Get User Statistics">>,
+ ?NODE(?T("Get User Statistics"),
(?NS_ADMINX(<<"user-stats">>))),
- ?NODE(<<"Get Number of Registered Users">>,
+ ?NODE(?T("Get Number of Registered Users"),
(?NS_ADMINX(<<"get-registered-users-num">>))),
- ?NODE(<<"Get Number of Online Users">>,
+ ?NODE(?T("Get Number of Online Users"),
(?NS_ADMINX(<<"get-online-users-num">>)))]};
get_local_items(_Host, [<<"http:">> | _], _Server,
_Lang) ->
@@ -559,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) ->
@@ -576,22 +575,22 @@ get_local_items(_Host, [<<"stopped nodes">>], _Server,
get_local_items({global, _Host},
[<<"running nodes">>, ENode], Server, Lang) ->
{result,
- [?NODE(<<"Database">>,
+ [?NODE(?T("Database"),
<<"running nodes/", ENode/binary, "/DB">>),
- ?NODE(<<"Modules">>,
+ ?NODE(?T("Modules"),
<<"running nodes/", ENode/binary, "/modules">>),
- ?NODE(<<"Backup Management">>,
+ ?NODE(?T("Backup Management"),
<<"running nodes/", ENode/binary, "/backup">>),
- ?NODE(<<"Import Users From jabberd14 Spool Files">>,
+ ?NODE(?T("Import Users From jabberd14 Spool Files"),
<<"running nodes/", ENode/binary, "/import">>),
- ?NODE(<<"Restart Service">>,
+ ?NODE(?T("Restart Service"),
<<"running nodes/", ENode/binary, "/restart">>),
- ?NODE(<<"Shut Down Service">>,
+ ?NODE(?T("Shut Down Service"),
<<"running nodes/", ENode/binary, "/shutdown">>)]};
get_local_items({vhost, _Host},
[<<"running nodes">>, ENode], Server, Lang) ->
{result,
- [?NODE(<<"Modules">>,
+ [?NODE(?T("Modules"),
<<"running nodes/", ENode/binary, "/modules">>)]};
get_local_items(_Host,
[<<"running nodes">>, _ENode, <<"DB">>], _Server,
@@ -601,9 +600,9 @@ get_local_items(_Host,
[<<"running nodes">>, ENode, <<"modules">>], Server,
Lang) ->
{result,
- [?NODE(<<"Start Modules">>,
+ [?NODE(?T("Start Modules"),
<<"running nodes/", ENode/binary, "/modules/start">>),
- ?NODE(<<"Stop Modules">>,
+ ?NODE(?T("Stop Modules"),
<<"running nodes/", ENode/binary, "/modules/stop">>)]};
get_local_items(_Host,
[<<"running nodes">>, _ENode, <<"modules">>, _],
@@ -613,11 +612,11 @@ get_local_items(_Host,
[<<"running nodes">>, ENode, <<"backup">>], Server,
Lang) ->
{result,
- [?NODE(<<"Backup">>,
+ [?NODE(?T("Backup"),
<<"running nodes/", ENode/binary, "/backup/backup">>),
- ?NODE(<<"Restore">>,
+ ?NODE(?T("Restore"),
<<"running nodes/", ENode/binary, "/backup/restore">>),
- ?NODE(<<"Dump to Text File">>,
+ ?NODE(?T("Dump to Text File"),
<<"running nodes/", ENode/binary,
"/backup/textfile">>)]};
get_local_items(_Host,
@@ -628,9 +627,9 @@ get_local_items(_Host,
[<<"running nodes">>, ENode, <<"import">>], Server,
Lang) ->
{result,
- [?NODE(<<"Import File">>,
+ [?NODE(?T("Import File"),
<<"running nodes/", ENode/binary, "/import/file">>),
- ?NODE(<<"Import Directory">>,
+ ?NODE(?T("Import Directory"),
<<"running nodes/", ENode/binary, "/import/dir">>)]};
get_local_items(_Host,
[<<"running nodes">>, _ENode, <<"import">>, _], _Server,
@@ -647,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} -> [];
@@ -659,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
@@ -695,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} -> [];
@@ -705,13 +707,14 @@ get_outgoing_s2s(Host, Lang) ->
Host == FH orelse str:suffix(DotHost, FH)],
lists:map(
fun (T) ->
- Name = str:format(?T(Lang, <<"To ~s">>),[T]),
+ Name = str:format(tr(Lang, ?T("To ~s")),[T]),
#disco_item{jid = jid:make(Host),
node = <<"outgoing s2s/", T/binary>>,
name = Name}
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,7 +722,7 @@ get_outgoing_s2s(Host, Lang, To) ->
lists:map(
fun ({F, _T}) ->
Node = <<"outgoing s2s/", To/binary, "/", F/binary>>,
- Name = str:format(?T(Lang, <<"From ~s">>), [F]),
+ Name = str:format(tr(Lang, ?T("From ~s")), [F]),
#disco_item{jid = jid:make(Host), node = Node, name = Name}
end,
lists:keysort(1,
@@ -728,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} -> [];
@@ -742,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))
@@ -764,7 +769,7 @@ get_stopped_nodes(_Lang) ->
-define(COMMANDS_RESULT(LServerOrGlobal, From, To,
Request, Lang),
case acl:match_rule(LServerOrGlobal, configure, From) of
- deny -> {error, xmpp:err_forbidden(<<"Access denied by service policy">>, Lang)};
+ deny -> {error, xmpp:err_forbidden(?T("Access denied by service policy"), Lang)};
allow -> adhoc_local_commands(From, To, Request)
end).
@@ -794,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,
@@ -826,7 +832,7 @@ adhoc_local_commands(From,
{error, Error} -> {error, Error}
end;
true ->
- {error, xmpp:err_bad_request(<<"Unexpected action">>, Lang)}
+ {error, xmpp:err_bad_request(?T("Unexpected action"), Lang)}
end.
-define(TVFIELD(Type, Var, Val),
@@ -836,14 +842,14 @@ adhoc_local_commands(From,
?TVFIELD(hidden, <<"FORM_TYPE">>, (?NS_ADMIN))).
-define(TLFIELD(Type, Label, Var),
- #xdata_field{type = Type, label = ?T(Lang, Label), var = Var}).
+ #xdata_field{type = Type, label = tr(Lang, Label), var = Var}).
-define(XFIELD(Type, Label, Var, Val),
- #xdata_field{type = Type, label = ?T(Lang, Label),
+ #xdata_field{type = Type, label = tr(Lang, Label),
var = Var, values = [Val]}).
-define(XMFIELD(Type, Label, Var, Vals),
- #xdata_field{type = Type, label = ?T(Lang, Label),
+ #xdata_field{type = Type, label = tr(Lang, Label),
var = Var, values = Vals}).
-define(TABLEFIELD(Table, Val),
@@ -852,20 +858,23 @@ adhoc_local_commands(From,
label = iolist_to_binary(atom_to_list(Table)),
var = iolist_to_binary(atom_to_list(Table)),
values = [iolist_to_binary(atom_to_list(Val))],
- options = [#xdata_option{label = ?T(Lang, <<"RAM copy">>),
+ options = [#xdata_option{label = tr(Lang, ?T("RAM copy")),
value = <<"ram_copies">>},
- #xdata_option{label = ?T(Lang, <<"RAM and disc copy">>),
+ #xdata_option{label = tr(Lang, ?T("RAM and disc copy")),
value = <<"disc_copies">>},
- #xdata_option{label = ?T(Lang, <<"Disc only copy">>),
+ #xdata_option{label = tr(Lang, ?T("Disc only copy")),
value = <<"disc_only_copies">>},
- #xdata_option{label = ?T(Lang, <<"Remote copy">>),
+ #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
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case ejabberd_cluster:call(Node, mnesia, system_info, [tables]) of
@@ -875,9 +884,9 @@ get_form(_Host, [<<"running nodes">>, ENode, <<"DB">>],
{error, xmpp:err_internal_server_error()};
Tables ->
STables = lists:sort(Tables),
- Title = <<(?T(Lang, <<"Database Tables Configuration at ">>))/binary,
+ Title = <<(tr(Lang, ?T("Database Tables Configuration at ")))/binary,
ENode/binary>>,
- Instr = ?T(Lang, <<"Choose storage type of tables">>),
+ Instr = tr(Lang, ?T("Choose storage type of tables")),
try
Fs = lists:map(
fun(Table) ->
@@ -904,7 +913,7 @@ get_form(Host,
Lang) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case ejabberd_cluster:call(Node, gen_mod, loaded_modules, [Host]) of
@@ -914,9 +923,9 @@ get_form(Host,
{error, xmpp:err_internal_server_error()};
Modules ->
SModules = lists:sort(Modules),
- Title = <<(?T(Lang, <<"Stop Modules at ">>))/binary,
+ Title = <<(tr(Lang, ?T("Stop Modules at ")))/binary,
ENode/binary>>,
- Instr = ?T(Lang, <<"Choose modules to stop">>),
+ Instr = tr(Lang, ?T("Choose modules to stop")),
Fs = lists:map(fun(M) ->
S = misc:atom_to_binary(M),
?XFIELD(boolean, S, S, <<"0">>)
@@ -932,85 +941,85 @@ get_form(_Host,
<<"start">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Start Modules at ">>))/binary, ENode/binary>>,
+ #xdata{title = <<(tr(Lang, ?T("Start Modules at ")))/binary, ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter list of {Module, [Options]}">>)],
+ instructions = [tr(Lang, ?T("Enter list of {Module, [Options]}"))],
fields = [?HFIELD(),
?XFIELD('text-multi',
- <<"List of modules to start">>, <<"modules">>,
+ ?T("List of modules to start"), <<"modules">>,
<<"[].">>)]}};
get_form(_Host,
[<<"running nodes">>, ENode, <<"backup">>,
<<"backup">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Backup to File at ">>))/binary, ENode/binary>>,
+ #xdata{title = <<(tr(Lang, ?T("Backup to File at ")))/binary, ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter path to backup file">>)],
+ instructions = [tr(Lang, ?T("Enter path to backup file"))],
fields = [?HFIELD(),
- ?XFIELD('text-single', <<"Path to File">>,
+ ?XFIELD('text-single', ?T("Path to File"),
<<"path">>, <<"">>)]}};
get_form(_Host,
[<<"running nodes">>, ENode, <<"backup">>,
<<"restore">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Restore Backup from File at ">>))/binary,
+ #xdata{title = <<(tr(Lang, ?T("Restore Backup from File at ")))/binary,
ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter path to backup file">>)],
+ instructions = [tr(Lang, ?T("Enter path to backup file"))],
fields = [?HFIELD(),
- ?XFIELD('text-single', <<"Path to File">>,
+ ?XFIELD('text-single', ?T("Path to File"),
<<"path">>, <<"">>)]}};
get_form(_Host,
[<<"running nodes">>, ENode, <<"backup">>,
<<"textfile">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Dump Backup to Text File at ">>))/binary,
+ #xdata{title = <<(tr(Lang, ?T("Dump Backup to Text File at ")))/binary,
ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter path to text file">>)],
+ instructions = [tr(Lang, ?T("Enter path to text file"))],
fields = [?HFIELD(),
- ?XFIELD('text-single', <<"Path to File">>,
+ ?XFIELD('text-single', ?T("Path to File"),
<<"path">>, <<"">>)]}};
get_form(_Host,
[<<"running nodes">>, ENode, <<"import">>, <<"file">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Import User from File at ">>))/binary,
+ #xdata{title = <<(tr(Lang, ?T("Import User from File at ")))/binary,
ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter path to jabberd14 spool file">>)],
+ instructions = [tr(Lang, ?T("Enter path to jabberd14 spool file"))],
fields = [?HFIELD(),
- ?XFIELD('text-single', <<"Path to File">>,
+ ?XFIELD('text-single', ?T("Path to File"),
<<"path">>, <<"">>)]}};
get_form(_Host,
[<<"running nodes">>, ENode, <<"import">>, <<"dir">>],
Lang) ->
{result,
- #xdata{title = <<(?T(Lang, <<"Import Users from Dir at ">>))/binary,
+ #xdata{title = <<(tr(Lang, ?T("Import Users from Dir at ")))/binary,
ENode/binary>>,
type = form,
- instructions = [?T(Lang, <<"Enter path to jabberd14 spool dir">>)],
+ instructions = [tr(Lang, ?T("Enter path to jabberd14 spool dir"))],
fields = [?HFIELD(),
- ?XFIELD('text-single', <<"Path to Dir">>,
+ ?XFIELD('text-single', ?T("Path to Dir"),
<<"path">>, <<"">>)]}};
get_form(_Host,
[<<"running nodes">>, _ENode, <<"restart">>], Lang) ->
Make_option =
fun (LabelNum, LabelUnit, Value) ->
#xdata_option{
- label = <<LabelNum/binary, (?T(Lang, LabelUnit))/binary>>,
+ label = <<LabelNum/binary, (tr(Lang, LabelUnit))/binary>>,
value = Value}
end,
{result,
- #xdata{title = ?T(Lang, <<"Restart Service">>),
+ #xdata{title = tr(Lang, ?T("Restart Service")),
type = form,
fields = [?HFIELD(),
#xdata_field{
type = 'list-single',
- label = ?T(Lang, <<"Time delay">>),
+ label = tr(Lang, ?T("Time delay")),
var = <<"delay">>,
required = true,
options =
@@ -1027,30 +1036,30 @@ get_form(_Host,
Make_option(<<"15 ">>, <<"minutes">>, <<"900">>),
Make_option(<<"30 ">>, <<"minutes">>, <<"1800">>)]},
#xdata_field{type = fixed,
- label = ?T(Lang,
- <<"Send announcement to all online users "
- "on all hosts">>)},
+ label = tr(Lang,
+ ?T("Send announcement to all online users "
+ "on all hosts"))},
#xdata_field{var = <<"subject">>,
type = 'text-single',
- label = ?T(Lang, <<"Subject">>)},
+ label = tr(Lang, ?T("Subject"))},
#xdata_field{var = <<"announcement">>,
type = 'text-multi',
- label = ?T(Lang, <<"Message body">>)}]}};
+ label = tr(Lang, ?T("Message body"))}]}};
get_form(_Host,
[<<"running nodes">>, _ENode, <<"shutdown">>], Lang) ->
Make_option =
fun (LabelNum, LabelUnit, Value) ->
#xdata_option{
- label = <<LabelNum/binary, (?T(Lang, LabelUnit))/binary>>,
+ label = <<LabelNum/binary, (tr(Lang, LabelUnit))/binary>>,
value = Value}
end,
{result,
- #xdata{title = ?T(Lang, <<"Shut Down Service">>),
+ #xdata{title = tr(Lang, ?T("Shut Down Service")),
type = form,
fields = [?HFIELD(),
#xdata_field{
type = 'list-single',
- label = ?T(Lang, <<"Time delay">>),
+ label = tr(Lang, ?T("Time delay")),
var = <<"delay">>,
required = true,
options =
@@ -1067,128 +1076,92 @@ get_form(_Host,
Make_option(<<"15 ">>, <<"minutes">>, <<"900">>),
Make_option(<<"30 ">>, <<"minutes">>, <<"1800">>)]},
#xdata_field{type = fixed,
- label = ?T(Lang,
- <<"Send announcement to all online users "
- "on all hosts">>)},
+ label = tr(Lang,
+ ?T("Send announcement to all online users "
+ "on all hosts"))},
#xdata_field{var = <<"subject">>,
type = 'text-single',
- label = ?T(Lang, <<"Subject">>)},
+ label = tr(Lang, ?T("Subject"))},
#xdata_field{var = <<"announcement">>,
type = 'text-multi',
- label = ?T(Lang, <<"Message body">>)}]}};
-get_form(Host, [<<"config">>, <<"acls">>], Lang) ->
- ACLs = str:tokens(
- str:format("~p.",
- [mnesia:dirty_select(
- acl,
- ets:fun2ms(
- fun({acl, {Name, H}, Spec}) when H == Host ->
- {acl, Name, Spec}
- end))]),
- <<"\n">>),
- {result,
- #xdata{title = ?T(Lang, <<"Access Control List Configuration">>),
- type = form,
- fields = [?HFIELD(),
- #xdata_field{type = 'text-multi',
- label = ?T(Lang, <<"Access Control Lists">>),
- var = <<"acls">>,
- values = ACLs}]}};
-get_form(Host, [<<"config">>, <<"access">>], Lang) ->
- Accs = str:tokens(
- str:format("~p.",
- [mnesia:dirty_select(
- access,
- ets:fun2ms(
- fun({access, {Name, H}, Acc}) when H == Host ->
- {access, Name, Acc}
- end))]),
- <<"\n">>),
- {result,
- #xdata{title = ?T(Lang, <<"Access Configuration">>),
- type = form,
- fields = [?HFIELD(),
- #xdata_field{type = 'text-multi',
- label = ?T(Lang, <<"Access Rules">>),
- var = <<"access">>,
- values = Accs}]}};
+ label = tr(Lang, ?T("Message body"))}]}};
get_form(_Host, ?NS_ADMINL(<<"add-user">>), Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Add User">>),
+ #xdata{title = tr(Lang, ?T("Add User")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
required = true,
var = <<"accountjid">>},
#xdata_field{type = 'text-private',
- label = ?T(Lang, <<"Password">>),
+ label = tr(Lang, ?T("Password")),
required = true,
var = <<"password">>},
#xdata_field{type = 'text-private',
- label = ?T(Lang, <<"Password Verification">>),
+ label = tr(Lang, ?T("Password Verification")),
required = true,
var = <<"password-verify">>}]}};
get_form(_Host, ?NS_ADMINL(<<"delete-user">>), Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Delete User">>),
+ #xdata{title = tr(Lang, ?T("Delete User")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-multi',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
required = true,
var = <<"accountjids">>}]}};
get_form(_Host, ?NS_ADMINL(<<"end-user-session">>),
Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"End User Session">>),
+ #xdata{title = tr(Lang, ?T("End User Session")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
required = true,
var = <<"accountjid">>}]}};
get_form(_Host, ?NS_ADMINL(<<"get-user-password">>),
Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Get User Password">>),
+ #xdata{title = tr(Lang, ?T("Get User Password")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
var = <<"accountjid">>,
required = true}]}};
get_form(_Host, ?NS_ADMINL(<<"change-user-password">>),
Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Change User Password">>),
+ #xdata{title = tr(Lang, ?T("Change User Password")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
required = true,
var = <<"accountjid">>},
#xdata_field{type = 'text-private',
- label = ?T(Lang, <<"Password">>),
+ label = tr(Lang, ?T("Password")),
required = true,
var = <<"password">>}]}};
get_form(_Host, ?NS_ADMINL(<<"get-user-lastlogin">>),
Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Get User Last Login Time">>),
+ #xdata{title = tr(Lang, ?T("Get User Last Login Time")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
var = <<"accountjid">>,
required = true}]}};
get_form(_Host, ?NS_ADMINL(<<"user-stats">>), Lang) ->
{result,
- #xdata{title = ?T(Lang, <<"Get User Statistics">>),
+ #xdata{title = tr(Lang, ?T("Get User Statistics")),
type = form,
fields = [?HFIELD(),
#xdata_field{type = 'jid-single',
- label = ?T(Lang, <<"Jabber ID">>),
+ label = tr(Lang, ?T("Jabber ID")),
var = <<"accountjid">>,
required = true}]}};
get_form(Host,
@@ -1198,7 +1171,7 @@ get_form(Host,
#xdata{type = form,
fields = [?HFIELD(),
#xdata_field{type = 'text-single',
- label = ?T(Lang, <<"Number of registered users">>),
+ label = tr(Lang, ?T("Number of registered users")),
var = <<"registeredusersnum">>,
values = [Num]}]}};
get_form(Host, ?NS_ADMINL(<<"get-online-users-num">>),
@@ -1208,17 +1181,19 @@ get_form(Host, ?NS_ADMINL(<<"get-online-users-num">>),
#xdata{type = form,
fields = [?HFIELD(),
#xdata_field{type = 'text-single',
- label = ?T(Lang, <<"Number of online users">>),
+ label = tr(Lang, ?T("Number of online users")),
var = <<"onlineusersnum">>,
values = [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
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
lists:foreach(
@@ -1250,7 +1225,7 @@ set_form(_From, Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
lists:foreach(
@@ -1271,12 +1246,12 @@ set_form(_From, Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"modules">>, XData) of
[] ->
- Txt = <<"No 'modules' found in data form">>,
+ Txt = ?T("No 'modules' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
Strings ->
String = lists:foldl(fun (S, Res) ->
@@ -1295,11 +1270,11 @@ set_form(_From, Host,
Modules),
{result, undefined};
_ ->
- Txt = <<"Parse failed">>,
+ Txt = ?T("Parse failed"),
{error, xmpp:err_bad_request(Txt, Lang)}
end;
_ ->
- Txt = <<"Scan failed">>,
+ Txt = ?T("Scan failed"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end
@@ -1310,12 +1285,12 @@ set_form(_From, _Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"path">>, XData) of
[] ->
- Txt = <<"No 'path' found in data form">>,
+ Txt = ?T("No 'path' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
[String] ->
case ejabberd_cluster:call(Node, mnesia, backup, [String]) of
@@ -1331,7 +1306,7 @@ set_form(_From, _Host,
{result, undefined}
end;
_ ->
- Txt = <<"Incorrect value of 'path' in data form">>,
+ Txt = ?T("Incorrect value of 'path' in data form"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end;
@@ -1341,12 +1316,12 @@ set_form(_From, _Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"path">>, XData) of
[] ->
- Txt = <<"No 'path' found in data form">>,
+ Txt = ?T("No 'path' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
[String] ->
case ejabberd_cluster:call(Node, ejabberd_admin,
@@ -1363,7 +1338,7 @@ set_form(_From, _Host,
{result, undefined}
end;
_ ->
- Txt = <<"Incorrect value of 'path' in data form">>,
+ Txt = ?T("Incorrect value of 'path' in data form"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end;
@@ -1373,12 +1348,12 @@ set_form(_From, _Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"path">>, XData) of
[] ->
- Txt = <<"No 'path' found in data form">>,
+ Txt = ?T("No 'path' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
[String] ->
case ejabberd_cluster:call(Node, ejabberd_admin,
@@ -1395,7 +1370,7 @@ set_form(_From, _Host,
{result, undefined}
end;
_ ->
- Txt = <<"Incorrect value of 'path' in data form">>,
+ Txt = ?T("Incorrect value of 'path' in data form"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end;
@@ -1404,18 +1379,18 @@ set_form(_From, _Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"path">>, XData) of
[] ->
- Txt = <<"No 'path' found in data form">>,
+ Txt = ?T("No 'path' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
[String] ->
ejabberd_cluster:call(Node, jd2ejd, import_file, [String]),
{result, undefined};
_ ->
- Txt = <<"Incorrect value of 'path' in data form">>,
+ Txt = ?T("Incorrect value of 'path' in data form"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end;
@@ -1424,18 +1399,18 @@ set_form(_From, _Host,
Lang, XData) ->
case search_running_node(ENode) of
false ->
- Txt = <<"No running node found">>,
+ Txt = ?T("No running node found"),
{error, xmpp:err_item_not_found(Txt, Lang)};
Node ->
case xmpp_util:get_xdata_values(<<"path">>, XData) of
[] ->
- Txt = <<"No 'path' found in data form">>,
+ Txt = ?T("No 'path' found in data form"),
{error, xmpp:err_bad_request(Txt, Lang)};
[String] ->
ejabberd_cluster:call(Node, jd2ejd, import_dir, [String]),
{result, undefined};
_ ->
- Txt = <<"Incorrect value of 'path' in data form">>,
+ Txt = ?T("Incorrect value of 'path' in data form"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
end;
@@ -1447,75 +1422,6 @@ set_form(From, Host,
[<<"running nodes">>, ENode, <<"shutdown">>], _Lang,
XData) ->
stop_node(From, Host, ENode, stop, XData);
-set_form(_From, Host, [<<"config">>, <<"acls">>], Lang,
- XData) ->
- case xmpp_util:get_xdata_values(<<"acls">>, XData) of
- [] ->
- Txt = <<"No 'acls' found in data form">>,
- {error, xmpp:err_bad_request(Txt, Lang)};
- Strings ->
- String = lists:foldl(fun (S, Res) ->
- <<Res/binary, S/binary, "\n">>
- end, <<"">>, Strings),
- case erl_scan:string(binary_to_list(String)) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, ACLs} ->
- acl:add_list(Host, ACLs, true),
- {result, undefined};
- _ ->
- Txt = <<"Parse failed">>,
- {error, xmpp:err_bad_request(Txt, Lang)}
- end;
- _ ->
- {error, xmpp:err_bad_request(<<"Scan failed">>, Lang)}
- end
- end;
-set_form(_From, Host, [<<"config">>, <<"access">>],
- Lang, XData) ->
- SetAccess =
- fun(Rs) ->
- mnesia:transaction(
- fun () ->
- Os = mnesia:select(
- access,
- ets:fun2ms(
- fun({access, {_, H}, _} = O) when H == Host ->
- O
- end)),
- lists:foreach(fun mnesia:delete_object/1, Os),
- lists:foreach(
- fun({access, Name, Rules}) ->
- mnesia:write({access, {Name, Host}, Rules})
- end, Rs)
- end)
- end,
- case xmpp_util:get_xdata_values(<<"access">>, XData) of
- [] ->
- Txt = <<"No 'access' found in data form">>,
- {error, xmpp:err_bad_request(Txt, Lang)};
- Strings ->
- String = lists:foldl(fun (S, Res) ->
- <<Res/binary, S/binary, "\n">>
- end, <<"">>, Strings),
- case erl_scan:string(binary_to_list(String)) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, Rs} ->
- case SetAccess(Rs) of
- {atomic, _} ->
- {result, undefined};
- _ ->
- {error, xmpp:err_bad_request()}
- end;
- _ ->
- Txt = <<"Parse failed">>,
- {error, xmpp:err_bad_request(Txt, Lang)}
- end;
- _ ->
- {error, xmpp:err_bad_request(<<"Scan failed">>, Lang)}
- end
- end;
set_form(From, Host, ?NS_ADMINL(<<"add-user">>), _Lang,
XData) ->
AccountString = get_value(<<"accountjid">>, XData),
@@ -1524,7 +1430,7 @@ set_form(From, Host, ?NS_ADMINL(<<"add-user">>), _Lang,
AccountJID = jid:decode(AccountString),
User = AccountJID#jid.luser,
Server = AccountJID#jid.lserver,
- true = lists:member(Server, ejabberd_config:get_myhosts()),
+ true = lists:member(Server, ejabberd_option:hosts()),
true = Server == Host orelse
get_permission_level(From) == global,
case ejabberd_auth:try_register(User, Server, Password) of
@@ -1577,9 +1483,9 @@ set_form(From, Host,
{result,
#xdata{type = form,
fields = [?HFIELD(),
- ?XFIELD('jid-single', <<"Jabber ID">>,
+ ?XFIELD('jid-single', ?T("Jabber ID"),
<<"accountjid">>, AccountString),
- ?XFIELD('text-single', <<"Password">>,
+ ?XFIELD('text-single', ?T("Password"),
<<"password">>, Password)]}};
set_form(From, Host,
?NS_ADMINL(<<"change-user-password">>), _Lang, XData) ->
@@ -1606,7 +1512,7 @@ set_form(From, Host,
of
[] ->
case get_last_info(User, Server) of
- not_found -> ?T(Lang, <<"Never">>);
+ not_found -> tr(Lang, ?T("Never"));
{ok, Timestamp, _Status} ->
Shift = Timestamp,
TimeStamp = {Shift div 1000000, Shift rem 1000000, 0},
@@ -1616,14 +1522,14 @@ set_form(From, Host,
[Year, Month, Day, Hour,
Minute, Second]))
end;
- _ -> ?T(Lang, <<"Online">>)
+ _ -> tr(Lang, ?T("Online"))
end,
{result,
#xdata{type = form,
fields = [?HFIELD(),
- ?XFIELD('jid-single', <<"Jabber ID">>,
+ ?XFIELD('jid-single', ?T("Jabber ID"),
<<"accountjid">>, AccountString),
- ?XFIELD('text-single', <<"Last login">>,
+ ?XFIELD('text-single', ?T("Last login"),
<<"lastlogin">>, FLast)]}};
set_form(From, Host, ?NS_ADMINL(<<"user-stats">>), Lang,
XData) ->
@@ -1646,33 +1552,39 @@ set_form(From, Host, ?NS_ADMINL(<<"user-stats">>), Lang,
{result,
#xdata{type = form,
fields = [?HFIELD(),
- ?XFIELD('jid-single', <<"Jabber ID">>,
+ ?XFIELD('jid-single', ?T("Jabber ID"),
<<"accountjid">>, AccountString),
- ?XFIELD('text-single', <<"Roster size">>,
+ ?XFIELD('text-single', ?T("Roster size"),
<<"rostersize">>, Rostersize),
- ?XMFIELD('text-multi', <<"IP addresses">>,
+ ?XMFIELD('text-multi', ?T("IP addresses"),
<<"ipaddresses">>, IPs),
- ?XMFIELD('text-multi', <<"Resources">>,
+ ?XMFIELD('text-multi', ?T("Resources"),
<<"onlineresources">>, Resources)]}};
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
@@ -1700,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);
@@ -1710,14 +1623,15 @@ 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">>,
action = Action, xdata = XData} = Request) ->
case acl:match_rule(LServer, configure, From) of
deny ->
- {error, xmpp:err_forbidden(<<"Access denied by service policy">>, Lang)};
+ {error, xmpp:err_forbidden(?T("Access denied by service policy"), Lang)};
allow ->
ActionIsExecute = Action == execute orelse Action == complete,
if Action == cancel ->
@@ -1735,35 +1649,39 @@ adhoc_sm_commands(_Acc, From,
XData /= undefined, ActionIsExecute ->
set_sm_form(User, Server, <<"config">>, Request);
true ->
- Txt = <<"Unexpected action">>,
+ Txt = ?T("Unexpected action"),
{error, xmpp:err_bad_request(Txt, Lang)}
end
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,
- title = <<(?T(Lang, <<"Administration of ">>))/binary, User/binary>>,
+ title = <<(tr(Lang, ?T("Administration of ")))/binary, User/binary>>,
fields =
[?HFIELD(),
#xdata_field{
type = 'list-single',
- label = ?T(Lang, <<"Action on user">>),
+ label = tr(Lang, ?T("Action on user")),
var = <<"action">>,
values = [<<"edit">>],
options = [#xdata_option{
- label = ?T(Lang, <<"Edit Properties">>),
+ label = tr(Lang, ?T("Edit Properties")),
value = <<"edit">>},
#xdata_option{
- label = ?T(Lang, <<"Remove User">>),
+ label = tr(Lang, ?T("Remove User")),
value = <<"remove">>}]},
- ?XFIELD('text-private', <<"Password">>,
+ ?XFIELD('text-private', ?T("Password"),
<<"password">>,
ejabberd_auth:get_password_s(User, Server))]}};
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}) ->
@@ -1776,17 +1694,21 @@ set_sm_form(User, Server, <<"config">>,
ejabberd_auth:set_password(User, Server, Password),
xmpp_util:make_adhoc_response(Response);
_ ->
- Txt = <<"No 'password' found in data form">>,
+ Txt = ?T("No 'password' found in data form"),
{error, xmpp:err_not_acceptable(Txt, Lang)}
end;
[<<"remove">>] ->
catch ejabberd_auth:remove_user(User, Server),
xmpp_util:make_adhoc_response(Response);
_ ->
- Txt = <<"Incorrect value of 'action' in data form">>,
+ Txt = ?T("Incorrect value of 'action' in data form"),
{error, xmpp:err_not_acceptable(Txt, Lang)}
end;
set_sm_form(_User, _Server, _Node, _Request) ->
{error, xmpp:err_service_unavailable()}.
+-spec tr(binary(), binary()) -> binary().
+tr(Lang, Text) ->
+ translate:translate(Lang, Text).
+
mod_options(_) -> [].