diff options
Diffstat (limited to 'src/mod_configure.erl')
-rw-r--r-- | src/mod_configure.erl | 534 |
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(_) -> []. |