summaryrefslogtreecommitdiff
path: root/src/mod_configure.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
committerBadlop <badlop@process-one.net>2013-03-14 10:33:02 +0100
commit9deb294328bb3f9eb6bd2c0e7cd500732e9b5830 (patch)
tree7e1066c130250627ee0abab44a135f583a28d07f /src/mod_configure.erl
parentlist_to_integer/2 only works in OTP R14 and newer (diff)
Accumulated patch to binarize and indent code
Diffstat (limited to '')
-rw-r--r--src/mod_configure.erl3481
1 files changed, 1868 insertions, 1613 deletions
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index 091ea607..3d2b7d26 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -28,25 +28,21 @@
%%% (2005-08-19)
-module(mod_configure).
+
-author('alexey@process-one.net').
-behaviour(gen_mod).
--export([start/2,
- stop/1,
- get_local_identity/5,
- get_local_features/5,
- get_local_items/5,
- adhoc_local_items/4,
- adhoc_local_commands/4,
- get_sm_identity/5,
- get_sm_features/5,
- get_sm_items/5,
- adhoc_sm_items/4,
- adhoc_sm_commands/4]).
+-export([start/2, stop/1, get_local_identity/5,
+ get_local_features/5, get_local_items/5,
+ adhoc_local_items/4, adhoc_local_commands/4,
+ get_sm_identity/5, get_sm_features/5, get_sm_items/5,
+ adhoc_sm_items/4, adhoc_sm_commands/4]).
-include("ejabberd.hrl").
+
-include("jlib.hrl").
+
-include("adhoc.hrl").
-define(T(Lang, Text), translate:translate(Lang, Text)).
@@ -55,437 +51,466 @@
-record(session, {sid, usr, us, priority, info}).
start(Host, _Opts) ->
- ejabberd_hooks:add(disco_local_items, Host, ?MODULE, get_local_items, 50),
- ejabberd_hooks:add(disco_local_features, Host, ?MODULE, get_local_features, 50),
- ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, get_local_identity, 50),
- ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_items, 50),
- ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
- ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 50),
- ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, adhoc_local_items, 50),
- ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, adhoc_local_commands, 50),
- ejabberd_hooks:add(adhoc_sm_items, Host, ?MODULE, adhoc_sm_items, 50),
- ejabberd_hooks:add(adhoc_sm_commands, Host, ?MODULE, adhoc_sm_commands, 50),
+ ejabberd_hooks:add(disco_local_items, Host, ?MODULE,
+ get_local_items, 50),
+ ejabberd_hooks:add(disco_local_features, Host, ?MODULE,
+ get_local_features, 50),
+ ejabberd_hooks:add(disco_local_identity, Host, ?MODULE,
+ get_local_identity, 50),
+ ejabberd_hooks:add(disco_sm_items, Host, ?MODULE,
+ get_sm_items, 50),
+ ejabberd_hooks:add(disco_sm_features, Host, ?MODULE,
+ get_sm_features, 50),
+ ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE,
+ get_sm_identity, 50),
+ ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE,
+ adhoc_local_items, 50),
+ ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE,
+ adhoc_local_commands, 50),
+ ejabberd_hooks:add(adhoc_sm_items, Host, ?MODULE,
+ adhoc_sm_items, 50),
+ ejabberd_hooks:add(adhoc_sm_commands, Host, ?MODULE,
+ adhoc_sm_commands, 50),
ok.
stop(Host) ->
- ejabberd_hooks:delete(adhoc_sm_commands, Host, ?MODULE, adhoc_sm_commands, 50),
- ejabberd_hooks:delete(adhoc_sm_items, Host, ?MODULE, adhoc_sm_items, 50),
- ejabberd_hooks:delete(adhoc_local_commands, Host, ?MODULE, adhoc_local_commands, 50),
- ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, adhoc_local_items, 50),
- ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, get_sm_identity, 50),
- ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
- ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, get_sm_items, 50),
- ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 50),
- ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 50),
- ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_items, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_COMMANDS),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS).
+ ejabberd_hooks:delete(adhoc_sm_commands, Host, ?MODULE,
+ adhoc_sm_commands, 50),
+ ejabberd_hooks:delete(adhoc_sm_items, Host, ?MODULE,
+ adhoc_sm_items, 50),
+ ejabberd_hooks:delete(adhoc_local_commands, Host,
+ ?MODULE, adhoc_local_commands, 50),
+ ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE,
+ adhoc_local_items, 50),
+ ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE,
+ get_sm_identity, 50),
+ ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE,
+ get_sm_features, 50),
+ ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE,
+ get_sm_items, 50),
+ ejabberd_hooks:delete(disco_local_identity, Host,
+ ?MODULE, get_local_identity, 50),
+ ejabberd_hooks:delete(disco_local_features, Host,
+ ?MODULE, get_local_features, 50),
+ ejabberd_hooks:delete(disco_local_items, Host, ?MODULE,
+ get_local_items, 50),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
+ ?NS_COMMANDS),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, Host,
+ ?NS_COMMANDS).
%%%-----------------------------------------------------------------------
-define(INFO_IDENTITY(Category, Type, Name, Lang),
- [{xmlelement, "identity",
- [{"category", Category},
- {"type", Type},
- {"name", ?T(Lang, Name)}], []}]).
+ [#xmlel{name = <<"identity">>,
+ attrs =
+ [{<<"category">>, Category}, {<<"type">>, Type},
+ {<<"name">>, ?T(Lang, Name)}],
+ children = []}]).
-define(INFO_COMMAND(Name, Lang),
- ?INFO_IDENTITY("automation", "command-node", Name, Lang)).
+ ?INFO_IDENTITY(<<"automation">>, <<"command-node">>,
+ Name, Lang)).
-define(NODEJID(To, Name, Node),
- {xmlelement, "item",
- [{"jid", jlib:jid_to_string(To)},
- {"name", ?T(Lang, Name)},
- {"node", Node}], []}).
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, jlib:jid_to_string(To)},
+ {<<"name">>, ?T(Lang, Name)}, {<<"node">>, Node}],
+ children = []}).
-define(NODE(Name, Node),
- {xmlelement, "item",
- [{"jid", Server},
- {"name", ?T(Lang, Name)},
- {"node", Node}], []}).
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, Server}, {<<"name">>, ?T(Lang, Name)},
+ {<<"node">>, Node}],
+ children = []}).
+
+-define(NS_ADMINX(Sub),
+ <<(?NS_ADMIN)/binary, "#", Sub/binary>>).
--define(NS_ADMINX(Sub), ?NS_ADMIN++"#"++Sub).
--define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
-tokenize(Node) -> string:tokens(Node, "/#").
+-define(NS_ADMINL(Sub),
+ [<<"http:">>, <<"jabber.org">>, <<"protocol">>,
+ <<"admin">>, Sub]).
+
+tokenize(Node) -> str:tokens(Node, <<"/#">>).
get_sm_identity(Acc, _From, _To, Node, Lang) ->
case Node of
- "config" ->
- ?INFO_COMMAND("Configuration", Lang);
- _ ->
- Acc
+ <<"config">> ->
+ ?INFO_COMMAND(<<"Configuration">>, Lang);
+ _ -> Acc
end.
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);
- ["running nodes", _ENode, "modules", "start"] ->
- ?INFO_COMMAND("Start Modules", Lang);
- ["running nodes", _ENode, "modules", "stop"] ->
- ?INFO_COMMAND("Stop Modules", Lang);
- ["running nodes", _ENode, "backup", "backup"] ->
- ?INFO_COMMAND("Backup", Lang);
- ["running nodes", _ENode, "backup", "restore"] ->
- ?INFO_COMMAND("Restore", Lang);
- ["running nodes", _ENode, "backup", "textfile"] ->
- ?INFO_COMMAND("Dump to Text File", Lang);
- ["running nodes", _ENode, "import", "file"] ->
- ?INFO_COMMAND("Import File", Lang);
- ["running nodes", _ENode, "import", "dir"] ->
- ?INFO_COMMAND("Import Directory", Lang);
- ["running nodes", _ENode, "restart"] ->
- ?INFO_COMMAND("Restart Service", Lang);
- ["running nodes", _ENode, "shutdown"] ->
- ?INFO_COMMAND("Shut Down Service", Lang);
- ?NS_ADMINL("add-user") ->
- ?INFO_COMMAND("Add User", Lang);
- ?NS_ADMINL("delete-user") ->
- ?INFO_COMMAND("Delete User", Lang);
- ?NS_ADMINL("end-user-session") ->
- ?INFO_COMMAND("End User Session", Lang);
- ?NS_ADMINL("get-user-password") ->
- ?INFO_COMMAND("Get User Password", Lang);
- ?NS_ADMINL("change-user-password") ->
- ?INFO_COMMAND("Change User Password", Lang);
- ?NS_ADMINL("get-user-lastlogin") ->
- ?INFO_COMMAND("Get User Last Login Time", Lang);
- ?NS_ADMINL("user-stats") ->
- ?INFO_COMMAND("Get User Statistics", Lang);
- ?NS_ADMINL("get-registered-users-num") ->
- ?INFO_COMMAND("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);
- _ ->
- Acc
+ [<<"running nodes">>, ENode] ->
+ ?INFO_IDENTITY(<<"ejabberd">>, <<"node">>, ENode, Lang);
+ [<<"running nodes">>, _ENode, <<"DB">>] ->
+ ?INFO_COMMAND(<<"Database">>, Lang);
+ [<<"running nodes">>, _ENode, <<"modules">>,
+ <<"start">>] ->
+ ?INFO_COMMAND(<<"Start Modules">>, Lang);
+ [<<"running nodes">>, _ENode, <<"modules">>,
+ <<"stop">>] ->
+ ?INFO_COMMAND(<<"Stop Modules">>, Lang);
+ [<<"running nodes">>, _ENode, <<"backup">>,
+ <<"backup">>] ->
+ ?INFO_COMMAND(<<"Backup">>, Lang);
+ [<<"running nodes">>, _ENode, <<"backup">>,
+ <<"restore">>] ->
+ ?INFO_COMMAND(<<"Restore">>, Lang);
+ [<<"running nodes">>, _ENode, <<"backup">>,
+ <<"textfile">>] ->
+ ?INFO_COMMAND(<<"Dump to Text File">>, Lang);
+ [<<"running nodes">>, _ENode, <<"import">>,
+ <<"file">>] ->
+ ?INFO_COMMAND(<<"Import File">>, Lang);
+ [<<"running nodes">>, _ENode, <<"import">>,
+ <<"dir">>] ->
+ ?INFO_COMMAND(<<"Import Directory">>, Lang);
+ [<<"running nodes">>, _ENode, <<"restart">>] ->
+ ?INFO_COMMAND(<<"Restart Service">>, Lang);
+ [<<"running nodes">>, _ENode, <<"shutdown">>] ->
+ ?INFO_COMMAND(<<"Shut Down Service">>, Lang);
+ ?NS_ADMINL(<<"add-user">>) ->
+ ?INFO_COMMAND(<<"Add User">>, Lang);
+ ?NS_ADMINL(<<"delete-user">>) ->
+ ?INFO_COMMAND(<<"Delete User">>, Lang);
+ ?NS_ADMINL(<<"end-user-session">>) ->
+ ?INFO_COMMAND(<<"End User Session">>, Lang);
+ ?NS_ADMINL(<<"get-user-password">>) ->
+ ?INFO_COMMAND(<<"Get User Password">>, Lang);
+ ?NS_ADMINL(<<"change-user-password">>) ->
+ ?INFO_COMMAND(<<"Change User Password">>, Lang);
+ ?NS_ADMINL(<<"get-user-lastlogin">>) ->
+ ?INFO_COMMAND(<<"Get User Last Login Time">>, Lang);
+ ?NS_ADMINL(<<"user-stats">>) ->
+ ?INFO_COMMAND(<<"Get User Statistics">>, Lang);
+ ?NS_ADMINL(<<"get-registered-users-num">>) ->
+ ?INFO_COMMAND(<<"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);
+ _ -> Acc
end.
%%%-----------------------------------------------------------------------
-define(INFO_RESULT(Allow, Feats),
case Allow of
- deny ->
- {error, ?ERR_FORBIDDEN};
- allow ->
- {result, Feats}
+ deny -> {error, ?ERR_FORBIDDEN};
+ allow -> {result, Feats}
end).
-get_sm_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
+get_sm_features(Acc, From,
+ #jid{lserver = LServer} = _To, Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
- false ->
- Acc;
- _ ->
- Allow = acl:match_rule(LServer, configure, From),
- case Node of
- "config" ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- _ ->
- Acc
- end
+ false -> Acc;
+ _ ->
+ Allow = acl:match_rule(LServer, configure, From),
+ case Node of
+ <<"config">> -> ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ _ -> Acc
+ end
end.
-get_local_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
+get_local_features(Acc, From,
+ #jid{lserver = LServer} = _To, Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
- false ->
- Acc;
- _ ->
- LNode = tokenize(Node),
- Allow = acl:match_rule(LServer, configure, From),
- case LNode of
- ["config"] ->
- ?INFO_RESULT(Allow, []);
- ["user"] ->
- ?INFO_RESULT(Allow, []);
- ["online users"] ->
- ?INFO_RESULT(Allow, []);
- ["all users"] ->
- ?INFO_RESULT(Allow, []);
- ["all users", [$@ | _]] ->
- ?INFO_RESULT(Allow, []);
- ["outgoing s2s" | _] ->
- ?INFO_RESULT(Allow, []);
- ["running nodes"] ->
- ?INFO_RESULT(Allow, []);
- ["stopped nodes"] ->
- ?INFO_RESULT(Allow, []);
- ["running nodes", _ENode] ->
- ?INFO_RESULT(Allow, [?NS_STATS]);
- ["running nodes", _ENode, "DB"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["running nodes", _ENode, "modules"] ->
- ?INFO_RESULT(Allow, []);
- ["running nodes", _ENode, "modules", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["running nodes", _ENode, "backup"] ->
- ?INFO_RESULT(Allow, []);
- ["running nodes", _ENode, "backup", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["running nodes", _ENode, "import"] ->
- ?INFO_RESULT(Allow, []);
- ["running nodes", _ENode, "import", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["running nodes", _ENode, "restart"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["running nodes", _ENode, "shutdown"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ["config", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("add-user") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("delete-user") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("end-user-session") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("get-user-password") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("change-user-password") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("get-user-lastlogin") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("user-stats") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("get-registered-users-num") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- ?NS_ADMINL("get-online-users-num") ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
- _ ->
- Acc
- end
+ false -> Acc;
+ _ ->
+ LNode = tokenize(Node),
+ Allow = acl:match_rule(LServer, configure, From),
+ case LNode of
+ [<<"config">>] -> ?INFO_RESULT(Allow, []);
+ [<<"user">>] -> ?INFO_RESULT(Allow, []);
+ [<<"online users">>] -> ?INFO_RESULT(Allow, []);
+ [<<"all users">>] -> ?INFO_RESULT(Allow, []);
+ [<<"all users">>, <<$@, _/binary>>] ->
+ ?INFO_RESULT(Allow, []);
+ [<<"outgoing s2s">> | _] -> ?INFO_RESULT(Allow, []);
+ [<<"running nodes">>] -> ?INFO_RESULT(Allow, []);
+ [<<"stopped nodes">>] -> ?INFO_RESULT(Allow, []);
+ [<<"running nodes">>, _ENode] ->
+ ?INFO_RESULT(Allow, [?NS_STATS]);
+ [<<"running nodes">>, _ENode, <<"DB">>] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"running nodes">>, _ENode, <<"modules">>] ->
+ ?INFO_RESULT(Allow, []);
+ [<<"running nodes">>, _ENode, <<"modules">>, _] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"running nodes">>, _ENode, <<"backup">>] ->
+ ?INFO_RESULT(Allow, []);
+ [<<"running nodes">>, _ENode, <<"backup">>, _] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"running nodes">>, _ENode, <<"import">>] ->
+ ?INFO_RESULT(Allow, []);
+ [<<"running nodes">>, _ENode, <<"import">>, _] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"running nodes">>, _ENode, <<"restart">>] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"running nodes">>, _ENode, <<"shutdown">>] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ [<<"config">>, _] ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"add-user">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"delete-user">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"end-user-session">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"get-user-password">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"change-user-password">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"get-user-lastlogin">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"user-stats">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"get-registered-users-num">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?NS_ADMINL(<<"get-online-users-num">>) ->
+ ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ _ -> Acc
+ end
end.
%%%-----------------------------------------------------------------------
-adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To, Lang) ->
+adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To,
+ Lang) ->
case acl:match_rule(LServer, configure, From) of
- allow ->
- Items = case Acc of
- {result, Its} -> Its;
- empty -> []
- end,
- Nodes = [{xmlelement, "item",
- [{"jid", jlib:jid_to_string(To)},
- {"name", ?T(Lang, "Configuration")},
- {"node", "config"}], []}],
- {result, Items ++ Nodes};
- _ ->
- Acc
+ allow ->
+ Items = case Acc of
+ {result, Its} -> Its;
+ empty -> []
+ end,
+ Nodes = [#xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, jlib:jid_to_string(To)},
+ {<<"name">>, ?T(Lang, <<"Configuration">>)},
+ {<<"node">>, <<"config">>}],
+ children = []}],
+ {result, Items ++ Nodes};
+ _ -> Acc
end.
%%%-----------------------------------------------------------------------
get_sm_items(Acc, From,
- #jid{user = User, server = Server, lserver = LServer} = To,
+ #jid{user = User, server = Server, lserver = LServer} =
+ To,
Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
- false ->
- Acc;
- _ ->
- Items = case Acc of
- {result, Its} -> Its;
- empty -> []
- end,
- case {acl:match_rule(LServer, configure, From), Node} of
- {allow, ""} ->
- Nodes = [?NODEJID(To, "Configuration", "config"),
- ?NODEJID(To, "User Management", "user")],
- {result, Items ++ Nodes ++ get_user_resources(User, Server)};
- {allow, "config"} ->
- {result, []};
- {_, "config"} ->
- {error, ?ERR_FORBIDDEN};
- _ ->
- Acc
- end
+ false -> Acc;
+ _ ->
+ Items = case Acc of
+ {result, Its} -> Its;
+ empty -> []
+ end,
+ case {acl:match_rule(LServer, configure, From), Node} of
+ {allow, <<"">>} ->
+ Nodes = [?NODEJID(To, <<"Configuration">>,
+ <<"config">>),
+ ?NODEJID(To, <<"User Management">>, <<"user">>)],
+ {result,
+ Items ++ Nodes ++ get_user_resources(User, Server)};
+ {allow, <<"config">>} -> {result, []};
+ {_, <<"config">>} -> {error, ?ERR_FORBIDDEN};
+ _ -> Acc
+ end
end.
get_user_resources(User, Server) ->
Rs = ejabberd_sm:get_user_resources(User, Server),
- lists:map(fun(R) ->
- {xmlelement, "item",
- [{"jid", User ++ "@" ++ Server ++ "/" ++ R},
- {"name", User}], []}
- end, lists:sort(Rs)).
+ lists:map(fun (R) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>,
+ <<User/binary, "@", Server/binary, "/",
+ R/binary>>},
+ {<<"name">>, User}],
+ children = []}
+ end,
+ lists:sort(Rs)).
%%%-----------------------------------------------------------------------
-adhoc_local_items(Acc, From, #jid{lserver = LServer, server = Server} = To,
- Lang) ->
+adhoc_local_items(Acc, From,
+ #jid{lserver = LServer, server = Server} = To, Lang) ->
case acl:match_rule(LServer, configure, From) of
- allow ->
- Items = case Acc of
- {result, Its} -> Its;
- empty -> []
- end,
- PermLev = get_permission_level(From),
- %% Recursively get all configure commands
- Nodes = recursively_get_local_items(PermLev, LServer, "", Server,
- Lang),
- Nodes1 = lists:filter(
- fun(N) ->
- Nd = xml:get_tag_attr_s("node", N),
- F = get_local_features([], From, To, Nd, Lang),
- case F of
- {result, [?NS_COMMANDS]} ->
- true;
- _ ->
- false
- end
- end, Nodes),
- {result, Items ++ Nodes1};
- _ ->
- Acc
+ allow ->
+ Items = case Acc of
+ {result, Its} -> Its;
+ empty -> []
+ end,
+ PermLev = get_permission_level(From),
+ Nodes = recursively_get_local_items(PermLev, LServer,
+ <<"">>, Server, Lang),
+ Nodes1 = lists:filter(fun (N) ->
+ Nd = xml:get_tag_attr_s(<<"node">>, N),
+ F = get_local_features([], From, To, Nd,
+ Lang),
+ case F of
+ {result, [?NS_COMMANDS]} -> true;
+ _ -> false
+ end
+ end,
+ Nodes),
+ {result, Items ++ Nodes1};
+ _ -> Acc
end.
-recursively_get_local_items(_PermLev, _LServer, "online users", _Server, _Lang) ->
+recursively_get_local_items(_PermLev, _LServer,
+ <<"online users">>, _Server, _Lang) ->
[];
-
-recursively_get_local_items(_PermLev, _LServer, "all users", _Server, _Lang) ->
+recursively_get_local_items(_PermLev, _LServer,
+ <<"all users">>, _Server, _Lang) ->
[];
-
-recursively_get_local_items(PermLev, LServer, Node, Server, Lang) ->
+recursively_get_local_items(PermLev, LServer, Node,
+ Server, Lang) ->
LNode = tokenize(Node),
- Items = case get_local_items({PermLev, LServer}, LNode, Server, Lang) of
- {result, Res} ->
- Res;
- {error, _Error} ->
- []
+ Items = case get_local_items({PermLev, LServer}, LNode,
+ Server, Lang)
+ of
+ {result, Res} -> Res;
+ {error, _Error} -> []
end,
- Nodes = lists:flatten(
- lists:map(
- fun(N) ->
- S = xml:get_tag_attr_s("jid", N),
- Nd = xml:get_tag_attr_s("node", N),
- if (S /= Server) or (Nd == "") ->
- [];
- true ->
- [N, recursively_get_local_items(
- PermLev, LServer, Nd, Server, Lang)]
- end
- end, Items)),
+ Nodes = lists:flatten(lists:map(fun (N) ->
+ S = xml:get_tag_attr_s(<<"jid">>,
+ N),
+ Nd = xml:get_tag_attr_s(<<"node">>,
+ N),
+ if (S /= Server) or
+ (Nd == <<"">>) ->
+ [];
+ true ->
+ [N,
+ recursively_get_local_items(PermLev,
+ LServer,
+ Nd,
+ Server,
+ Lang)]
+ end
+ end,
+ Items)),
Nodes.
get_permission_level(JID) ->
case acl:match_rule(global, configure, JID) of
- allow -> global;
- deny -> vhost
+ allow -> global;
+ deny -> vhost
end.
%%%-----------------------------------------------------------------------
-define(ITEMS_RESULT(Allow, LNode, Fallback),
case Allow of
- deny ->
- Fallback;
- allow ->
- PermLev = get_permission_level(From),
- case get_local_items({PermLev, LServer}, LNode,
- jlib:jid_to_string(To), Lang) of
- {result, Res} ->
- {result, Res};
- {error, Error} ->
- {error, Error}
- end
+ deny -> Fallback;
+ allow ->
+ PermLev = get_permission_level(From),
+ case get_local_items({PermLev, LServer}, LNode,
+ jlib:jid_to_string(To), Lang)
+ of
+ {result, Res} -> {result, Res};
+ {error, Error} -> {error, Error}
+ end
end).
-get_local_items(Acc, From, #jid{lserver = LServer} = To, "", Lang) ->
+get_local_items(Acc, From, #jid{lserver = LServer} = To,
+ <<"">>, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
- false ->
- Acc;
- _ ->
- Items = case Acc of
- {result, Its} -> Its;
- empty -> []
- end,
- Allow = acl:match_rule(LServer, configure, From),
- case Allow of
- deny ->
- {result, Items};
- allow ->
- PermLev = get_permission_level(From),
- case get_local_items({PermLev, LServer}, [],
- jlib:jid_to_string(To), Lang) of
- {result, Res} ->
- {result, Items ++ Res};
- {error, _Error} ->
- {result, Items}
- end
- end
+ false -> Acc;
+ _ ->
+ Items = case Acc of
+ {result, Its} -> Its;
+ empty -> []
+ end,
+ Allow = acl:match_rule(LServer, configure, From),
+ case Allow of
+ deny -> {result, Items};
+ allow ->
+ PermLev = get_permission_level(From),
+ case get_local_items({PermLev, LServer}, [],
+ jlib:jid_to_string(To), Lang)
+ of
+ {result, Res} -> {result, Items ++ Res};
+ {error, _Error} -> {result, Items}
+ end
+ end
end;
-
-get_local_items(Acc, From, #jid{lserver = LServer} = To, Node, Lang) ->
+get_local_items(Acc, From, #jid{lserver = LServer} = To,
+ Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
- false ->
- Acc;
- _ ->
- LNode = tokenize(Node),
- Allow = acl:match_rule(LServer, configure, From),
- case LNode of
- ["config"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["user"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["online users"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["all users"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["all users", [$@ | _]] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["outgoing s2s" | _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["stopped nodes"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "DB"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "modules"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "modules", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "backup"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "backup", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "import"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "import", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "restart"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["running nodes", _ENode, "shutdown"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ["config", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("add-user") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("delete-user") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("end-user-session") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("get-user-password") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("change-user-password") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("get-user-lastlogin") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("user-stats") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("get-registered-users-num") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- ?NS_ADMINL("get-online-users-num") ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
- _ ->
- Acc
- end
+ false -> Acc;
+ _ ->
+ LNode = tokenize(Node),
+ Allow = acl:match_rule(LServer, configure, From),
+ case LNode of
+ [<<"config">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"user">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"online users">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"all users">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"all users">>, <<$@, _/binary>>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"outgoing s2s">> | _] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"stopped nodes">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"DB">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"modules">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"modules">>, _] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"backup">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"backup">>, _] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"import">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"import">>, _] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"restart">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"running nodes">>, _ENode, <<"shutdown">>] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ [<<"config">>, _] ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"add-user">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"delete-user">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"end-user-session">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"get-user-password">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"change-user-password">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"get-user-lastlogin">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"user-stats">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"get-registered-users-num">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?NS_ADMINL(<<"get-online-users-num">>) ->
+ ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ _ -> Acc
+ end
end.
%%%-----------------------------------------------------------------------
@@ -495,1403 +520,1633 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To, Node, Lang) ->
%% PermissionLevel = global | vhost
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", "outgoing s2s"),
- ?NODE("Running Nodes", "running nodes"),
- ?NODE("Stopped Nodes", "stopped nodes")
- ]};
-
-get_local_items(_Host, ["config"], Server, Lang) ->
+ [?NODE(<<"Configuration">>, <<"config">>),
+ ?NODE(<<"User Management">>, <<"user">>),
+ ?NODE(<<"Online Users">>, <<"online users">>),
+ ?NODE(<<"All Users">>, <<"all users">>),
+ ?NODE(<<"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")
- ]};
-
-get_local_items(_Host, ["config", _], _Server, _Lang) ->
+ [?NODE(<<"Access Control Lists">>, <<"config/acls">>),
+ ?NODE(<<"Access Rules">>, <<"config/access">>)]};
+get_local_items(_Host, [<<"config">>, _], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items(_Host, ["user"], Server, Lang) ->
+get_local_items(_Host, [<<"user">>], Server, Lang) ->
{result,
- [?NODE("Add User", ?NS_ADMINX("add-user")),
- ?NODE("Delete User", ?NS_ADMINX("delete-user")),
- ?NODE("End User Session", ?NS_ADMINX("end-user-session")),
- ?NODE("Get User Password", ?NS_ADMINX("get-user-password")),
- ?NODE("Change User Password",?NS_ADMINX("change-user-password")),
- ?NODE("Get User Last Login Time", ?NS_ADMINX("get-user-lastlogin")),
- ?NODE("Get User Statistics", ?NS_ADMINX("user-stats")),
- ?NODE("Get Number of Registered Users",?NS_ADMINX("get-registered-users-num")),
- ?NODE("Get Number of Online Users",?NS_ADMINX("get-online-users-num"))
- ]};
-
-get_local_items(_Host, ["http:" | _], _Server, _Lang) ->
+ [?NODE(<<"Add User">>, (?NS_ADMINX(<<"add-user">>))),
+ ?NODE(<<"Delete User">>,
+ (?NS_ADMINX(<<"delete-user">>))),
+ ?NODE(<<"End User Session">>,
+ (?NS_ADMINX(<<"end-user-session">>))),
+ ?NODE(<<"Get User Password">>,
+ (?NS_ADMINX(<<"get-user-password">>))),
+ ?NODE(<<"Change User Password">>,
+ (?NS_ADMINX(<<"change-user-password">>))),
+ ?NODE(<<"Get User Last Login Time">>,
+ (?NS_ADMINX(<<"get-user-lastlogin">>))),
+ ?NODE(<<"Get User Statistics">>,
+ (?NS_ADMINX(<<"user-stats">>))),
+ ?NODE(<<"Get Number of Registered Users">>,
+ (?NS_ADMINX(<<"get-registered-users-num">>))),
+ ?NODE(<<"Get Number of Online Users">>,
+ (?NS_ADMINX(<<"get-online-users-num">>)))]};
+get_local_items(_Host, [<<"http:">> | _], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items({_, Host}, ["online users"], _Server, _Lang) ->
+get_local_items({_, Host}, [<<"online users">>],
+ _Server, _Lang) ->
{result, get_online_vh_users(Host)};
-
-get_local_items({_, Host}, ["all users"], _Server, _Lang) ->
+get_local_items({_, Host}, [<<"all users">>], _Server,
+ _Lang) ->
{result, get_all_vh_users(Host)};
-
-get_local_items({_, Host}, ["all users", [$@ | Diap]], _Server, _Lang) ->
- case catch ejabberd_auth:get_vh_registered_users(Host) of
- {'EXIT', _Reason} ->
- ?ERR_INTERNAL_SERVER_ERROR;
- Users ->
- SUsers = lists:sort([{S, U} || {U, S} <- Users]),
- case catch begin
- [S1, S2] = ejabberd_regexp:split(Diap, "-"),
- N1 = list_to_integer(S1),
- N2 = list_to_integer(S2),
- Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
- lists:map(fun({S, U}) ->
- {xmlelement, "item",
- [{"jid", U ++ "@" ++ S},
- {"name", U ++ "@" ++ S}], []}
- end, Sub)
- end of
- {'EXIT', _Reason} ->
- ?ERR_NOT_ACCEPTABLE;
- Res ->
- {result, Res}
- end
+get_local_items({_, Host},
+ [<<"all users">>, <<$@, Diap/binary>>], _Server,
+ _Lang) ->
+ case catch ejabberd_auth:get_vh_registered_users(Host)
+ of
+ {'EXIT', _Reason} -> ?ERR_INTERNAL_SERVER_ERROR;
+ Users ->
+ SUsers = lists:sort([{S, U} || {U, S} <- Users]),
+ case catch begin
+ [S1, S2] = ejabberd_regexp:split(Diap, <<"-">>),
+ N1 = jlib:binary_to_integer(S1),
+ N2 = jlib:binary_to_integer(S2),
+ Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
+ lists:map(fun ({S, U}) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>,
+ <<U/binary, "@",
+ S/binary>>},
+ {<<"name">>,
+ <<U/binary, "@",
+ S/binary>>}],
+ children = []}
+ end,
+ Sub)
+ end
+ of
+ {'EXIT', _Reason} -> ?ERR_NOT_ACCEPTABLE;
+ Res -> {result, Res}
+ end
end;
-
-get_local_items({_, Host}, ["outgoing s2s"], _Server, Lang) ->
+get_local_items({_, Host}, [<<"outgoing s2s">>],
+ _Server, Lang) ->
{result, get_outgoing_s2s(Host, Lang)};
-
-get_local_items({_, Host}, ["outgoing s2s", To], _Server, Lang) ->
+get_local_items({_, Host}, [<<"outgoing s2s">>, To],
+ _Server, Lang) ->
{result, get_outgoing_s2s(Host, Lang, To)};
-
-get_local_items(_Host, ["running nodes"], Server, Lang) ->
+get_local_items(_Host, [<<"running nodes">>], Server,
+ Lang) ->
{result, get_running_nodes(Server, Lang)};
-
-get_local_items(_Host, ["stopped nodes"], _Server, Lang) ->
+get_local_items(_Host, [<<"stopped nodes">>], _Server,
+ Lang) ->
{result, get_stopped_nodes(Lang)};
-
-get_local_items({global, _Host}, ["running nodes", ENode], Server, Lang) ->
+get_local_items({global, _Host},
+ [<<"running nodes">>, ENode], Server, Lang) ->
{result,
- [?NODE("Database", "running nodes/" ++ ENode ++ "/DB"),
- ?NODE("Modules", "running nodes/" ++ ENode ++ "/modules"),
- ?NODE("Backup Management", "running nodes/" ++ ENode ++ "/backup"),
- ?NODE("Import Users From jabberd14 Spool Files",
- "running nodes/" ++ ENode ++ "/import"),
- ?NODE("Restart Service", "running nodes/" ++ ENode ++ "/restart"),
- ?NODE("Shut Down Service", "running nodes/" ++ ENode ++ "/shutdown")
- ]};
-
-get_local_items({vhost, _Host}, ["running nodes", ENode], Server, Lang) ->
+ [?NODE(<<"Database">>,
+ <<"running nodes/", ENode/binary, "/DB">>),
+ ?NODE(<<"Modules">>,
+ <<"running nodes/", ENode/binary, "/modules">>),
+ ?NODE(<<"Backup Management">>,
+ <<"running nodes/", ENode/binary, "/backup">>),
+ ?NODE(<<"Import Users From jabberd14 Spool Files">>,
+ <<"running nodes/", ENode/binary, "/import">>),
+ ?NODE(<<"Restart Service">>,
+ <<"running nodes/", ENode/binary, "/restart">>),
+ ?NODE(<<"Shut Down Service">>,
+ <<"running nodes/", ENode/binary, "/shutdown">>)]};
+get_local_items({vhost, _Host},
+ [<<"running nodes">>, ENode], Server, Lang) ->
{result,
- [?NODE("Modules", "running nodes/" ++ ENode ++ "/modules")
- ]};
-
-get_local_items(_Host, ["running nodes", _ENode, "DB"], _Server, _Lang) ->
+ [?NODE(<<"Modules">>,
+ <<"running nodes/", ENode/binary, "/modules">>)]};
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"DB">>], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items(_Host, ["running nodes", ENode, "modules"], Server, Lang) ->
+get_local_items(_Host,
+ [<<"running nodes">>, ENode, <<"modules">>], Server,
+ Lang) ->
{result,
- [?NODE("Start Modules", "running nodes/" ++ ENode ++ "/modules/start"),
- ?NODE("Stop Modules", "running nodes/" ++ ENode ++ "/modules/stop")
- ]};
-
-get_local_items(_Host, ["running nodes", _ENode, "modules", _], _Server, _Lang) ->
+ [?NODE(<<"Start Modules">>,
+ <<"running nodes/", ENode/binary, "/modules/start">>),
+ ?NODE(<<"Stop Modules">>,
+ <<"running nodes/", ENode/binary, "/modules/stop">>)]};
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"modules">>, _],
+ _Server, _Lang) ->
{result, []};
-
-get_local_items(_Host, ["running nodes", ENode, "backup"], Server, Lang) ->
+get_local_items(_Host,
+ [<<"running nodes">>, ENode, <<"backup">>], Server,
+ Lang) ->
{result,
- [?NODE("Backup", "running nodes/" ++ ENode ++ "/backup/backup"),
- ?NODE("Restore", "running nodes/" ++ ENode ++ "/backup/restore"),
- ?NODE("Dump to Text File",
- "running nodes/" ++ ENode ++ "/backup/textfile")
- ]};
-
-get_local_items(_Host, ["running nodes", _ENode, "backup", _], _Server, _Lang) ->
+ [?NODE(<<"Backup">>,
+ <<"running nodes/", ENode/binary, "/backup/backup">>),
+ ?NODE(<<"Restore">>,
+ <<"running nodes/", ENode/binary, "/backup/restore">>),
+ ?NODE(<<"Dump to Text File">>,
+ <<"running nodes/", ENode/binary,
+ "/backup/textfile">>)]};
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"backup">>, _], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items(_Host, ["running nodes", ENode, "import"], Server, Lang) ->
+get_local_items(_Host,
+ [<<"running nodes">>, ENode, <<"import">>], Server,
+ Lang) ->
{result,
- [?NODE("Import File", "running nodes/" ++ ENode ++ "/import/file"),
- ?NODE("Import Directory", "running nodes/" ++ ENode ++ "/import/dir")
- ]};
-
-get_local_items(_Host, ["running nodes", _ENode, "import", _], _Server, _Lang) ->
+ [?NODE(<<"Import File">>,
+ <<"running nodes/", ENode/binary, "/import/file">>),
+ ?NODE(<<"Import Directory">>,
+ <<"running nodes/", ENode/binary, "/import/dir">>)]};
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"import">>, _], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items(_Host, ["running nodes", _ENode, "restart"], _Server, _Lang) ->
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"restart">>], _Server,
+ _Lang) ->
{result, []};
-
-get_local_items(_Host, ["running nodes", _ENode, "shutdown"], _Server, _Lang) ->
+get_local_items(_Host,
+ [<<"running nodes">>, _ENode, <<"shutdown">>], _Server,
+ _Lang) ->
{result, []};
-
get_local_items(_Host, _, _Server, _Lang) ->
{error, ?ERR_ITEM_NOT_FOUND}.
-
get_online_vh_users(Host) ->
case catch ejabberd_sm:get_vh_session_list(Host) of
- {'EXIT', _Reason} ->
- [];
- USRs ->
- SURs = lists:sort([{S, U, R} || {U, S, R} <- USRs]),
- lists:map(fun({S, U, R}) ->
- {xmlelement, "item",
- [{"jid", U ++ "@" ++ S ++ "/" ++ R},
- {"name", U ++ "@" ++ S}], []}
- end, SURs)
+ {'EXIT', _Reason} -> [];
+ USRs ->
+ SURs = lists:sort([{S, U, R} || {U, S, R} <- USRs]),
+ lists:map(fun ({S, U, R}) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>,
+ <<U/binary, "@", S/binary, "/",
+ R/binary>>},
+ {<<"name">>,
+ <<U/binary, "@", S/binary>>}],
+ children = []}
+ end,
+ SURs)
end.
get_all_vh_users(Host) ->
- case catch ejabberd_auth:get_vh_registered_users(Host) of
- {'EXIT', _Reason} ->
- [];
- Users ->
- SUsers = lists:sort([{S, U} || {U, S} <- Users]),
- case length(SUsers) of
- N when N =< 100 ->
- lists:map(fun({S, U}) ->
- {xmlelement, "item",
- [{"jid", U ++ "@" ++ S},
- {"name", U ++ "@" ++ S}], []}
- end, SUsers);
- N ->
- NParts = trunc(math:sqrt(N * 0.618)) + 1,
- M = trunc(N / NParts) + 1,
- lists:map(fun(K) ->
- L = K + M - 1,
- Node =
- "@" ++ integer_to_list(K) ++
- "-" ++ integer_to_list(L),
- {FS, FU} = lists:nth(K, SUsers),
- {LS, LU} =
- if L < N -> lists:nth(L, SUsers);
- true -> lists:last(SUsers)
- end,
- Name =
- FU ++ "@" ++ FS ++
- " -- " ++
- LU ++ "@" ++ LS,
- {xmlelement, "item",
- [{"jid", Host},
- {"node", "all users/" ++ Node},
- {"name", Name}], []}
- end, lists:seq(1, N, M))
- end
+ case catch ejabberd_auth:get_vh_registered_users(Host)
+ of
+ {'EXIT', _Reason} -> [];
+ Users ->
+ SUsers = lists:sort([{S, U} || {U, S} <- Users]),
+ case length(SUsers) of
+ N when N =< 100 ->
+ lists:map(fun ({S, U}) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>,
+ <<U/binary, "@", S/binary>>},
+ {<<"name">>,
+ <<U/binary, "@", S/binary>>}],
+ children = []}
+ end,
+ SUsers);
+ N ->
+ NParts = trunc(math:sqrt(N * 6.17999999999999993783e-1))
+ + 1,
+ M = trunc(N / NParts) + 1,
+ lists:map(fun (K) ->
+ L = K + M - 1,
+ Node = <<"@",
+ (iolist_to_binary(integer_to_list(K)))/binary,
+ "-",
+ (iolist_to_binary(integer_to_list(L)))/binary>>,
+ {FS, FU} = lists:nth(K, SUsers),
+ {LS, LU} = if L < N -> lists:nth(L, SUsers);
+ true -> lists:last(SUsers)
+ end,
+ Name = <<FU/binary, "@", FS/binary, " -- ",
+ LU/binary, "@", LS/binary>>,
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, Host},
+ {<<"node">>,
+ <<"all users/", Node/binary>>},
+ {<<"name">>, Name}],
+ children = []}
+ end,
+ lists:seq(1, N, M))
+ end
end.
get_outgoing_s2s(Host, Lang) ->
case catch ejabberd_s2s:dirty_get_connections() of
- {'EXIT', _Reason} ->
- [];
- Connections ->
- DotHost = "." ++ Host,
- TConns = [TH || {FH, TH} <- Connections,
- Host == FH orelse lists:suffix(DotHost, FH)],
- lists:map(
- fun(T) ->
- {xmlelement, "item",
- [{"jid", Host},
- {"node", "outgoing s2s/" ++ T},
- {"name",
- lists:flatten(
- io_lib:format(
- ?T(Lang, "To ~s"), [T]))}],
- []}
- end, lists:usort(TConns))
+ {'EXIT', _Reason} -> [];
+ Connections ->
+ DotHost = <<".", Host/binary>>,
+ TConns = [TH
+ || {FH, TH} <- Connections,
+ Host == FH orelse str:suffix(DotHost, FH)],
+ lists:map(fun (T) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, Host},
+ {<<"node">>,
+ <<"outgoing s2s/", T/binary>>},
+ {<<"name">>,
+ iolist_to_binary(io_lib:format(?T(Lang,
+ <<"To ~s">>),
+ [T]))}],
+ children = []}
+ end,
+ lists:usort(TConns))
end.
get_outgoing_s2s(Host, Lang, To) ->
case catch ejabberd_s2s:dirty_get_connections() of
- {'EXIT', _Reason} ->
- [];
- Connections ->
- lists:map(
- fun({F, _T}) ->
- {xmlelement, "item",
- [{"jid", Host},
- {"node", "outgoing s2s/" ++ To ++ "/" ++ F},
- {"name",
- lists:flatten(
- io_lib:format(
- ?T(Lang, "From ~s"), [F]))}],
- []}
- end, lists:keysort(1, lists:filter(fun(E) ->
- element(2, E) == To
- end, Connections)))
+ {'EXIT', _Reason} -> [];
+ Connections ->
+ lists:map(fun ({F, _T}) ->
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, Host},
+ {<<"node">>,
+ <<"outgoing s2s/", To/binary, "/",
+ F/binary>>},
+ {<<"name">>,
+ iolist_to_binary(io_lib:format(?T(Lang,
+ <<"From ~s">>),
+ [F]))}],
+ children = []}
+ end,
+ lists:keysort(1,
+ lists:filter(fun (E) -> element(2, E) == To
+ end,
+ Connections)))
end.
-
get_running_nodes(Server, _Lang) ->
case catch mnesia:system_info(running_db_nodes) of
- {'EXIT', _Reason} ->
- [];
- DBNodes ->
- lists:map(
- fun(N) ->
- S = atom_to_list(N),
- {xmlelement, "item",
- [{"jid", Server},
- {"node", "running nodes/" ++ S},
- {"name", S}],
- []}
- end, lists:sort(DBNodes))
+ {'EXIT', _Reason} -> [];
+ DBNodes ->
+ lists:map(fun (N) ->
+ S = iolist_to_binary(atom_to_list(N)),
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, Server},
+ {<<"node">>,
+ <<"running nodes/", S/binary>>},
+ {<<"name">>, S}],
+ children = []}
+ end,
+ lists:sort(DBNodes))
end.
get_stopped_nodes(_Lang) ->
- case catch (lists:usort(mnesia:system_info(db_nodes) ++
- mnesia:system_info(extra_db_nodes)) --
- mnesia:system_info(running_db_nodes)) of
- {'EXIT', _Reason} ->
- [];
- DBNodes ->
- lists:map(
- fun(N) ->
- S = atom_to_list(N),
- {xmlelement, "item",
- [{"jid", ?MYNAME},
- {"node", "stopped nodes/" ++ S},
- {"name", S}],
- []}
- end, lists:sort(DBNodes))
+ case catch lists:usort(mnesia:system_info(db_nodes) ++
+ mnesia:system_info(extra_db_nodes))
+ -- mnesia:system_info(running_db_nodes)
+ of
+ {'EXIT', _Reason} -> [];
+ DBNodes ->
+ lists:map(fun (N) ->
+ S = iolist_to_binary(atom_to_list(N)),
+ #xmlel{name = <<"item">>,
+ attrs =
+ [{<<"jid">>, ?MYNAME},
+ {<<"node">>,
+ <<"stopped nodes/", S/binary>>},
+ {<<"name">>, S}],
+ children = []}
+ end,
+ lists:sort(DBNodes))
end.
%%-------------------------------------------------------------------------
--define(COMMANDS_RESULT(LServerOrGlobal, From, To, Request),
+-define(COMMANDS_RESULT(LServerOrGlobal, From, To,
+ Request),
case acl:match_rule(LServerOrGlobal, configure, From) of
- deny ->
- {error, ?ERR_FORBIDDEN};
- allow ->
- adhoc_local_commands(From, To, Request)
+ deny -> {error, ?ERR_FORBIDDEN};
+ allow -> adhoc_local_commands(From, To, Request)
end).
-adhoc_local_commands(Acc, From, #jid{lserver = LServer} = To,
+adhoc_local_commands(Acc, From,
+ #jid{lserver = LServer} = To,
#adhoc_request{node = Node} = Request) ->
LNode = tokenize(Node),
case LNode of
- ["running nodes", _ENode, "DB"] ->
- ?COMMANDS_RESULT(global, From, To, Request);
- ["running nodes", _ENode, "modules", _] ->
- ?COMMANDS_RESULT(LServer, From, To, Request);
- ["running nodes", _ENode, "backup", _] ->
- ?COMMANDS_RESULT(global, From, To, Request);
- ["running nodes", _ENode, "import", _] ->
- ?COMMANDS_RESULT(global, From, To, Request);
- ["running nodes", _ENode, "restart"] ->
- ?COMMANDS_RESULT(global, From, To, Request);
- ["running nodes", _ENode, "shutdown"] ->
- ?COMMANDS_RESULT(global, From, To, Request);
- ["config", _] ->
- ?COMMANDS_RESULT(LServer, From, To, Request);
- ?NS_ADMINL(_) ->
- ?COMMANDS_RESULT(LServer, From, To, Request);
- _ ->
- Acc
+ [<<"running nodes">>, _ENode, <<"DB">>] ->
+ ?COMMANDS_RESULT(global, From, To, Request);
+ [<<"running nodes">>, _ENode, <<"modules">>, _] ->
+ ?COMMANDS_RESULT(LServer, From, To, Request);
+ [<<"running nodes">>, _ENode, <<"backup">>, _] ->
+ ?COMMANDS_RESULT(global, From, To, Request);
+ [<<"running nodes">>, _ENode, <<"import">>, _] ->
+ ?COMMANDS_RESULT(global, From, To, Request);
+ [<<"running nodes">>, _ENode, <<"restart">>] ->
+ ?COMMANDS_RESULT(global, From, To, Request);
+ [<<"running nodes">>, _ENode, <<"shutdown">>] ->
+ ?COMMANDS_RESULT(global, From, To, Request);
+ [<<"config">>, _] ->
+ ?COMMANDS_RESULT(LServer, From, To, Request);
+ ?NS_ADMINL(_) ->
+ ?COMMANDS_RESULT(LServer, From, To, Request);
+ _ -> Acc
end.
-adhoc_local_commands(From, #jid{lserver = LServer} = _To,
- #adhoc_request{lang = Lang,
- node = Node,
- sessionid = SessionID,
- action = Action,
- xdata = XData} = Request) ->
+adhoc_local_commands(From,
+ #jid{lserver = LServer} = _To,
+ #adhoc_request{lang = Lang, node = Node,
+ sessionid = SessionID, action = Action,
+ xdata = XData} =
+ Request) ->
LNode = tokenize(Node),
- %% If the "action" attribute is not present, it is
- %% understood as "execute". If there was no <actions/>
- %% element in the first response (which there isn't in our
- %% case), "execute" and "complete" are equivalent.
ActionIsExecute = lists:member(Action,
- ["", "execute", "complete"]),
- if Action == "cancel" ->
- %% User cancels request
- adhoc:produce_response(
- Request,
- #adhoc_response{status = canceled});
- XData == false, ActionIsExecute ->
- %% User requests form
- case get_form(LServer, LNode, Lang) of
- {result, Form} ->
- adhoc:produce_response(
- Request,
- #adhoc_response{status = executing,
- elements = Form});
- {result, Status, Form} ->
- adhoc:produce_response(
- Request,
- #adhoc_response{status = Status,
- elements = Form});
- {error, Error} ->
- {error, Error}
- end;
- XData /= false, ActionIsExecute ->
- %% User returns form.
- case jlib:parse_xdata_submit(XData) of
- invalid ->
- {error, ?ERR_BAD_REQUEST};
- Fields ->
- case catch set_form(From, LServer, LNode, Lang, Fields) of
- {result, Res} ->
- adhoc:produce_response(
- #adhoc_response{lang = Lang,
- node = Node,
- sessionid = SessionID,
- elements = Res,
- status = completed});
- {'EXIT', _} ->
- {error, ?ERR_BAD_REQUEST};
- {error, Error} ->
- {error, Error}
- end
- end;
- true ->
- {error, ?ERR_BAD_REQUEST}
+ [<<"">>, <<"execute">>, <<"complete">>]),
+ if Action == <<"cancel">> ->
+ adhoc:produce_response(Request,
+ #adhoc_response{status = canceled});
+ XData == false, ActionIsExecute ->
+ case get_form(LServer, LNode, Lang) of
+ {result, Form} ->
+ adhoc:produce_response(Request,
+ #adhoc_response{status = executing,
+ elements = Form});
+ {result, Status, Form} ->
+ adhoc:produce_response(Request,
+ #adhoc_response{status = Status,
+ elements = Form});
+ {error, Error} -> {error, Error}
+ end;
+ XData /= false, ActionIsExecute ->
+ case jlib:parse_xdata_submit(XData) of
+ invalid -> {error, ?ERR_BAD_REQUEST};
+ Fields ->
+ case catch set_form(From, LServer, LNode, Lang, Fields)
+ of
+ {result, Res} ->
+ adhoc:produce_response(#adhoc_response{lang = Lang,
+ node = Node,
+ sessionid =
+ SessionID,
+ elements = Res,
+ status =
+ completed});
+ {'EXIT', _} -> {error, ?ERR_BAD_REQUEST};
+ {error, Error} -> {error, Error}
+ end
+ end;
+ true -> {error, ?ERR_BAD_REQUEST}
end.
-
-define(TVFIELD(Type, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
--define(HFIELD(), ?TVFIELD("hidden", "FORM_TYPE", ?NS_ADMIN)).
+ #xmlel{name = <<"field">>,
+ attrs = [{<<"type">>, Type}, {<<"var">>, Var}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Val}]}]}).
+
+-define(HFIELD(),
+ ?TVFIELD(<<"hidden">>, <<"FORM_TYPE">>, (?NS_ADMIN))).
-define(TLFIELD(Type, Label, Var),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}], []}).
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, Type}, {<<"label">>, ?T(Lang, Label)},
+ {<<"var">>, Var}],
+ children = []}).
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, Type}, {<<"label">>, ?T(Lang, Label)},
+ {<<"var">>, Var}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Val}]}]}).
-define(XMFIELD(Type, Label, Var, Vals),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata,Val}]} || Val <- Vals]}).
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, Type}, {<<"label">>, ?T(Lang, Label)},
+ {<<"var">>, Var}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Val}]}
+ || Val <- Vals]}).
-define(TABLEFIELD(Table, Val),
- {xmlelement, "field", [{"type", "list-single"},
- {"label", atom_to_list(Table)},
- {"var", atom_to_list(Table)}],
- [{xmlelement, "value", [], [{xmlcdata, atom_to_list(Val)}]},
- {xmlelement, "option", [{"label",
- ?T(Lang, "RAM copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "ram_copies"}]}]},
- {xmlelement, "option", [{"label",
- ?T(Lang,
- "RAM and disc copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "disc_copies"}]}]},
- {xmlelement, "option", [{"label",
- ?T(Lang,
- "Disc only copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "disc_only_copies"}]}]},
- {xmlelement, "option", [{"label",
- ?T(Lang, "Remote copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "unknown"}]}]}
- ]}).
-
-
-
-get_form(_Host, ["running nodes", ENode, "DB"], Lang) ->
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"list-single">>},
+ {<<"label">>, iolist_to_binary(atom_to_list(Table))},
+ {<<"var">>, iolist_to_binary(atom_to_list(Table))}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata,
+ iolist_to_binary(atom_to_list(Val))}]},
+ #xmlel{name = <<"option">>,
+ attrs = [{<<"label">>, ?T(Lang, <<"RAM copy">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata, <<"ram_copies">>}]}]},
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>,
+ ?T(Lang, <<"RAM and disc copy">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata, <<"disc_copies">>}]}]},
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>, ?T(Lang, <<"Disc only copy">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<"disc_only_copies">>}]}]},
+ #xmlel{name = <<"option">>,
+ attrs = [{<<"label">>, ?T(Lang, <<"Remote copy">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata, <<"unknown">>}]}]}]}).
+
+get_form(_Host, [<<"running nodes">>, ENode, <<"DB">>],
+ Lang) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case rpc:call(Node, mnesia, system_info, [tables]) of
- {badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- Tables ->
- STables = lists:sort(Tables),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Database Tables Configuration at ") ++
- ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Choose storage type of tables")}]} |
- lists:map(
- fun(Table) ->
- case rpc:call(Node,
- mnesia,
- table_info,
- [Table, storage_type]) of
- {badrpc, _} ->
- ?TABLEFIELD(Table, unknown);
- Type ->
- ?TABLEFIELD(Table, Type)
- end
- end, STables)
- ]}]}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case rpc:call(Node, mnesia, system_info, [tables]) of
+ {badrpc, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ Tables ->
+ STables = lists:sort(Tables),
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Database Tables Configuration at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Choose storage type of tables">>)}]}
+ | lists:map(fun (Table) ->
+ case rpc:call(Node, mnesia,
+ table_info,
+ [Table,
+ storage_type])
+ of
+ {badrpc, _} ->
+ ?TABLEFIELD(Table,
+ unknown);
+ Type ->
+ ?TABLEFIELD(Table, Type)
+ end
+ end,
+ STables)]}]}
+ end
end;
-
-get_form(Host, ["running nodes", ENode, "modules", "stop"], Lang) ->
+get_form(Host,
+ [<<"running nodes">>, ENode, <<"modules">>, <<"stop">>],
+ Lang) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case rpc:call(Node, gen_mod, loaded_modules, [Host]) of
- {badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- Modules ->
- SModules = lists:sort(Modules),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Stop Modules at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Choose modules to stop")}]} |
- lists:map(fun(M) ->
- S = atom_to_list(M),
- ?XFIELD("boolean", S, S, "0")
- end, SModules)
- ]}]}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case rpc:call(Node, gen_mod, loaded_modules, [Host]) of
+ {badrpc, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ Modules ->
+ SModules = lists:sort(Modules),
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Stop Modules at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Choose modules to stop">>)}]}
+ | lists:map(fun (M) ->
+ S = jlib:atom_to_binary(M),
+ ?XFIELD(<<"boolean">>, S, S,
+ <<"0">>)
+ end,
+ SModules)]}]}
+ end
end;
-
-get_form(_Host, ["running nodes", ENode, "modules", "start"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Start Modules at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter list of {Module, [Options]}")}]},
- ?XFIELD("text-multi", "List of modules to start", "modules", "[].")
- ]}]};
-
-get_form(_Host, ["running nodes", ENode, "backup", "backup"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Backup to File at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter path to backup file")}]},
- ?XFIELD("text-single", "Path to File", "path", "")
- ]}]};
-
-get_form(_Host, ["running nodes", ENode, "backup", "restore"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Restore Backup from File at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter path to backup file")}]},
- ?XFIELD("text-single", "Path to File", "path", "")
- ]}]};
-
-get_form(_Host, ["running nodes", ENode, "backup", "textfile"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Dump Backup to Text File at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter path to text file")}]},
- ?XFIELD("text-single", "Path to File", "path", "")
- ]}]};
-
-get_form(_Host, ["running nodes", ENode, "import", "file"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Import User from File at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter path to jabberd14 spool file")}]},
- ?XFIELD("text-single", "Path to File", "path", "")
- ]}]};
-
-get_form(_Host, ["running nodes", ENode, "import", "dir"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Import Users from Dir at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Enter path to jabberd14 spool dir")}]},
- ?XFIELD("text-single", "Path to Dir", "path", "")
- ]}]};
-
-get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
- Make_option =
- fun(LabelNum, LabelUnit, Value)->
- {xmlelement, "option",
- [{"label", LabelNum ++ ?T(Lang, LabelUnit)}],
- [{xmlelement, "value", [], [{xmlcdata, Value}]}]}
- end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Restart Service")}]},
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", ?T(Lang, "Time delay")},
- {"var", "delay"}],
- [Make_option("", "immediately", "1"),
- Make_option("15 ", "seconds", "15"),
- Make_option("30 ", "seconds", "30"),
- Make_option("60 ", "seconds", "60"),
- Make_option("90 ", "seconds", "90"),
- Make_option("2 ", "minutes", "120"),
- Make_option("3 ", "minutes", "180"),
- Make_option("4 ", "minutes", "240"),
- Make_option("5 ", "minutes", "300"),
- Make_option("10 ", "minutes", "600"),
- Make_option("15 ", "minutes", "900"),
- Make_option("30 ", "minutes", "1800"),
- {xmlelement, "required", [], []}
- ]},
- {xmlelement, "field",
- [{"type", "fixed"},
- {"label", ?T(Lang, "Send announcement to all online users on all hosts")}],
- []},
- {xmlelement, "field",
- [{"var", "subject"},
- {"type", "text-single"},
- {"label", ?T(Lang, "Subject")}],
- []},
- {xmlelement, "field",
- [{"var", "announcement"},
- {"type", "text-multi"},
- {"label", ?T(Lang, "Message body")}],
- []}
- ]}]};
-
-get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
- Make_option =
- fun(LabelNum, LabelUnit, Value)->
- {xmlelement, "option",
- [{"label", LabelNum ++ ?T(Lang, LabelUnit)}],
- [{xmlelement, "value", [], [{xmlcdata, Value}]}]}
- end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Shut Down Service")}]},
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", ?T(Lang, "Time delay")},
- {"var", "delay"}],
- [Make_option("", "immediately", "1"),
- Make_option("15 ", "seconds", "15"),
- Make_option("30 ", "seconds", "30"),
- Make_option("60 ", "seconds", "60"),
- Make_option("90 ", "seconds", "90"),
- Make_option("2 ", "minutes", "120"),
- Make_option("3 ", "minutes", "180"),
- Make_option("4 ", "minutes", "240"),
- Make_option("5 ", "minutes", "300"),
- Make_option("10 ", "minutes", "600"),
- Make_option("15 ", "minutes", "900"),
- Make_option("30 ", "minutes", "1800"),
- {xmlelement, "required", [], []}
- ]},
- {xmlelement, "field",
- [{"type", "fixed"},
- {"label", ?T(Lang, "Send announcement to all online users on all hosts")}],
- []},
- {xmlelement, "field",
- [{"var", "subject"},
- {"type", "text-single"},
- {"label", ?T(Lang, "Subject")}],
- []},
- {xmlelement, "field",
- [{"var", "announcement"},
- {"type", "text-multi"},
- {"label", ?T(Lang, "Message body")}],
- []}
- ]}]};
-
-get_form(Host, ["config", "acls"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Access Control List Configuration")}]},
- {xmlelement, "field", [{"type", "text-multi"},
- {"label",
- ?T(
- Lang, "Access control lists")},
- {"var", "acls"}],
- lists:map(fun(S) ->
- {xmlelement, "value", [], [{xmlcdata, S}]}
- end,
- string:tokens(
- lists:flatten(
- io_lib:format(
- "~p.",
- [ets:select(acl,
- [{{acl, {'$1', '$2'}, '$3'},
- [{'==', '$2', Host}],
- [{{acl, '$1', '$3'}}]}])
- ])),
- "\n"))
- }
- ]}]};
-
-get_form(Host, ["config", "access"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Access Configuration")}]},
- {xmlelement, "field", [{"type", "text-multi"},
- {"label",
- ?T(
- Lang, "Access rules")},
- {"var", "access"}],
- lists:map(fun(S) ->
- {xmlelement, "value", [], [{xmlcdata, S}]}
- end,
- string:tokens(
- lists:flatten(
- io_lib:format(
- "~p.",
- [ets:select(config,
- [{{config, {access, '$1', '$2'}, '$3'},
- [{'==', '$2', Host}],
- [{{access, '$1', '$3'}}]}])
- ])),
- "\n"))
- }
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("add-user"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Add User")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]},
- {xmlelement, "field",
- [{"type", "text-private"},
- {"label", ?T(Lang, "Password")},
- {"var", "password"}],
- [{xmlelement, "required", [], []}]},
- {xmlelement, "field",
- [{"type", "text-private"},
- {"label", ?T(Lang, "Password Verification")},
- {"var", "password-verify"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("delete-user"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Delete User")}]},
- {xmlelement, "field",
- [{"type", "jid-multi"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjids"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("end-user-session"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "End User Session")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("get-user-password"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Password")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("change-user-password"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Password")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]},
- {xmlelement, "field",
- [{"type", "text-private"},
- {"label", ?T(Lang, "Password")},
- {"var", "password"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("get-user-lastlogin"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Last Login Time")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(_Host, ?NS_ADMINL("user-stats"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Statistics")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
- ]}]};
-
-get_form(Host, ?NS_ADMINL("get-registered-users-num"), Lang) ->
- [Num] = io_lib:format("~p", [ejabberd_auth:get_vh_registered_users_number(Host)]),
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"modules">>,
+ <<"start">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang, <<"Start Modules at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Enter list of {Module, [Options]}">>)}]},
+ ?XFIELD(<<"text-multi">>,
+ <<"List of modules to start">>, <<"modules">>,
+ <<"[].">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"backup">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang, <<"Backup to File at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang, <<"Enter path to backup file">>)}]},
+ ?XFIELD(<<"text-single">>, <<"Path to File">>,
+ <<"path">>, <<"">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"restore">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Restore Backup from File at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang, <<"Enter path to backup file">>)}]},
+ ?XFIELD(<<"text-single">>, <<"Path to File">>,
+ <<"path">>, <<"">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"textfile">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Dump Backup to Text File at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang, <<"Enter path to text file">>)}]},
+ ?XFIELD(<<"text-single">>, <<"Path to File">>,
+ <<"path">>, <<"">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"import">>, <<"file">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Import User from File at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Enter path to jabberd14 spool file">>)}]},
+ ?XFIELD(<<"text-single">>, <<"Path to File">>,
+ <<"path">>, <<"">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, ENode, <<"import">>, <<"dir">>],
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang,
+ <<"Import Users from Dir at ">>))/binary,
+ ENode/binary>>}]},
+ #xmlel{name = <<"instructions">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Enter path to jabberd14 spool dir">>)}]},
+ ?XFIELD(<<"text-single">>, <<"Path to Dir">>,
+ <<"path">>, <<"">>)]}]};
+get_form(_Host,
+ [<<"running nodes">>, _ENode, <<"restart">>], Lang) ->
+ Make_option = fun (LabelNum, LabelUnit, Value) ->
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>,
+ <<LabelNum/binary,
+ (?T(Lang, LabelUnit))/binary>>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Value}]}]}
+ end,
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"Restart Service">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"list-single">>},
+ {<<"label">>, ?T(Lang, <<"Time delay">>)},
+ {<<"var">>, <<"delay">>}],
+ children =
+ [Make_option(<<"">>, <<"immediately">>, <<"1">>),
+ Make_option(<<"15 ">>, <<"seconds">>, <<"15">>),
+ Make_option(<<"30 ">>, <<"seconds">>, <<"30">>),
+ Make_option(<<"60 ">>, <<"seconds">>, <<"60">>),
+ Make_option(<<"90 ">>, <<"seconds">>, <<"90">>),
+ Make_option(<<"2 ">>, <<"minutes">>, <<"120">>),
+ Make_option(<<"3 ">>, <<"minutes">>, <<"180">>),
+ Make_option(<<"4 ">>, <<"minutes">>, <<"240">>),
+ Make_option(<<"5 ">>, <<"minutes">>, <<"300">>),
+ Make_option(<<"10 ">>, <<"minutes">>, <<"600">>),
+ Make_option(<<"15 ">>, <<"minutes">>, <<"900">>),
+ Make_option(<<"30 ">>, <<"minutes">>, <<"1800">>),
+ #xmlel{name = <<"required">>, attrs = [],
+ children = []}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"fixed">>},
+ {<<"label">>,
+ ?T(Lang,
+ <<"Send announcement to all online users "
+ "on all hosts">>)}],
+ children = []},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"var">>, <<"subject">>},
+ {<<"type">>, <<"text-single">>},
+ {<<"label">>, ?T(Lang, <<"Subject">>)}],
+ children = []},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"var">>, <<"announcement">>},
+ {<<"type">>, <<"text-multi">>},
+ {<<"label">>, ?T(Lang, <<"Message body">>)}],
+ children = []}]}]};
+get_form(_Host,
+ [<<"running nodes">>, _ENode, <<"shutdown">>], Lang) ->
+ Make_option = fun (LabelNum, LabelUnit, Value) ->
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>,
+ <<LabelNum/binary,
+ (?T(Lang, LabelUnit))/binary>>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Value}]}]}
+ end,
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"Shut Down Service">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"list-single">>},
+ {<<"label">>, ?T(Lang, <<"Time delay">>)},
+ {<<"var">>, <<"delay">>}],
+ children =
+ [Make_option(<<"">>, <<"immediately">>, <<"1">>),
+ Make_option(<<"15 ">>, <<"seconds">>, <<"15">>),
+ Make_option(<<"30 ">>, <<"seconds">>, <<"30">>),
+ Make_option(<<"60 ">>, <<"seconds">>, <<"60">>),
+ Make_option(<<"90 ">>, <<"seconds">>, <<"90">>),
+ Make_option(<<"2 ">>, <<"minutes">>, <<"120">>),
+ Make_option(<<"3 ">>, <<"minutes">>, <<"180">>),
+ Make_option(<<"4 ">>, <<"minutes">>, <<"240">>),
+ Make_option(<<"5 ">>, <<"minutes">>, <<"300">>),
+ Make_option(<<"10 ">>, <<"minutes">>, <<"600">>),
+ Make_option(<<"15 ">>, <<"minutes">>, <<"900">>),
+ Make_option(<<"30 ">>, <<"minutes">>, <<"1800">>),
+ #xmlel{name = <<"required">>, attrs = [],
+ children = []}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"fixed">>},
+ {<<"label">>,
+ ?T(Lang,
+ <<"Send announcement to all online users "
+ "on all hosts">>)}],
+ children = []},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"var">>, <<"subject">>},
+ {<<"type">>, <<"text-single">>},
+ {<<"label">>, ?T(Lang, <<"Subject">>)}],
+ children = []},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"var">>, <<"announcement">>},
+ {<<"type">>, <<"text-multi">>},
+ {<<"label">>, ?T(Lang, <<"Message body">>)}],
+ children = []}]}]};
+get_form(Host, [<<"config">>, <<"acls">>], Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang,
+ <<"Access Control List Configuration">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-multi">>},
+ {<<"label">>,
+ ?T(Lang, <<"Access control lists">>)},
+ {<<"var">>, <<"acls">>}],
+ children =
+ lists:map(fun (S) ->
+ #xmlel{name = <<"value">>,
+ attrs = [],
+ children =
+ [{xmlcdata, S}]}
+ end,
+ str:tokens(iolist_to_binary(io_lib:format("~p.",
+ [ets:select(acl,
+ [{{acl,
+ {'$1',
+ '$2'},
+ '$3'},
+ [{'==',
+ '$2',
+ Host}],
+ [{{acl,
+ '$1',
+ '$3'}}]}])])),
+ <<"\n">>))}]}]};
+get_form(Host, [<<"config">>, <<"access">>], Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang, <<"Access Configuration">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-multi">>},
+ {<<"label">>, ?T(Lang, <<"Access rules">>)},
+ {<<"var">>, <<"access">>}],
+ children =
+ lists:map(fun (S) ->
+ #xmlel{name = <<"value">>,
+ attrs = [],
+ children =
+ [{xmlcdata, S}]}
+ end,
+ str:tokens(iolist_to_binary(io_lib:format("~p.",
+ [ets:select(config,
+ [{{config,
+ {access,
+ '$1',
+ '$2'},
+ '$3'},
+ [{'==',
+ '$2',
+ Host}],
+ [{{access,
+ '$1',
+ '$3'}}]}])])),
+ <<"\n">>))}]}]};
+get_form(_Host, ?NS_ADMINL(<<"add-user">>), Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children = [{xmlcdata, ?T(Lang, <<"Add User">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-private">>},
+ {<<"label">>, ?T(Lang, <<"Password">>)},
+ {<<"var">>, <<"password">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-private">>},
+ {<<"label">>,
+ ?T(Lang, <<"Password Verification">>)},
+ {<<"var">>, <<"password-verify">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"delete-user">>), Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children = [{xmlcdata, ?T(Lang, <<"Delete User">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-multi">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjids">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"end-user-session">>),
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"End User Session">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"get-user-password">>),
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"Get User Password">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"change-user-password">>),
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"Get User Password">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-private">>},
+ {<<"label">>, ?T(Lang, <<"Password">>)},
+ {<<"var">>, <<"password">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"get-user-lastlogin">>),
+ Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ ?T(Lang, <<"Get User Last Login Time">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(_Host, ?NS_ADMINL(<<"user-stats">>), Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata, ?T(Lang, <<"Get User Statistics">>)}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"jid-single">>},
+ {<<"label">>, ?T(Lang, <<"Jabber ID">>)},
+ {<<"var">>, <<"accountjid">>}],
+ children =
+ [#xmlel{name = <<"required">>, attrs = [],
+ children = []}]}]}]};
+get_form(Host,
+ ?NS_ADMINL(<<"get-registered-users-num">>), Lang) ->
+ Num = list_to_binary(
+ io_lib:format("~p",
+ [ejabberd_auth:get_vh_registered_users_number(Host)])),
{result, completed,
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement,
- "field",
- [{"type", "text-single"},
- {"label", ?T(Lang, "Number of registered users")},
- {"var", "registeredusersnum"}],
- [{xmlelement, "value", [], [{xmlcdata, Num}]}]
- }]}]};
-
-get_form(Host, ?NS_ADMINL("get-online-users-num"), Lang) ->
- Num = io_lib:format("~p", [length(ejabberd_sm:get_vh_session_list(Host))]),
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-single">>},
+ {<<"label">>,
+ ?T(Lang, <<"Number of registered users">>)},
+ {<<"var">>, <<"registeredusersnum">>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Num}]}]}]}]};
+get_form(Host, ?NS_ADMINL(<<"get-online-users-num">>),
+ Lang) ->
+ Num = list_to_binary(
+ io_lib:format("~p",
+ [length(ejabberd_sm:get_vh_session_list(Host))])),
{result, completed,
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement,
- "field",
- [{"type", "text-single"},
- {"label", ?T(Lang, "Number of online users")},
- {"var", "onlineusersnum"}],
- [{xmlelement, "value", [], [{xmlcdata, Num}]}]
- }]}]};
-
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"text-single">>},
+ {<<"label">>,
+ ?T(Lang, <<"Number of online users">>)},
+ {<<"var">>, <<"onlineusersnum">>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Num}]}]}]}]};
get_form(_Host, _, _Lang) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
-
-
-set_form(_From, _Host, ["running nodes", ENode, "DB"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"DB">>], _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- lists:foreach(
- fun({SVar, SVals}) ->
- %% We believe that this is allowed only for good people
- Table = list_to_atom(SVar),
- Type = case SVals of
- ["unknown"] -> unknown;
- ["ram_copies"] -> ram_copies;
- ["disc_copies"] -> disc_copies;
- ["disc_only_copies"] -> disc_only_copies;
- _ -> false
- end,
- if
- Type == false ->
- ok;
- Type == unknown ->
- mnesia:del_table_copy(Table, Node);
- true ->
- case mnesia:add_table_copy(Table, Node, Type) of
- {aborted, _} ->
- mnesia:change_table_copy_type(
- Table, Node, Type);
- _ ->
- ok
- end
- end
- end, XData),
- {result, []}
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ lists:foreach(fun ({SVar, SVals}) ->
+ Table = jlib:binary_to_atom(SVar),
+ Type = case SVals of
+ [<<"unknown">>] -> unknown;
+ [<<"ram_copies">>] -> ram_copies;
+ [<<"disc_copies">>] -> disc_copies;
+ [<<"disc_only_copies">>] ->
+ disc_only_copies;
+ _ -> false
+ end,
+ if Type == false -> ok;
+ Type == unknown ->
+ mnesia:del_table_copy(Table, Node);
+ true ->
+ case mnesia:add_table_copy(Table, Node,
+ Type)
+ of
+ {aborted, _} ->
+ mnesia:change_table_copy_type(Table,
+ Node,
+ Type);
+ _ -> ok
+ end
+ end
+ end,
+ XData),
+ {result, []}
end;
-
-set_form(_From, Host, ["running nodes", ENode, "modules", "stop"], _Lang, XData) ->
+set_form(_From, Host,
+ [<<"running nodes">>, ENode, <<"modules">>, <<"stop">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- lists:foreach(
- fun({Var, Vals}) ->
- case Vals of
- ["1"] ->
- Module = list_to_atom(Var),
- rpc:call(Node, gen_mod, stop_module, [Host, Module]);
- _ ->
- ok
- end
- end, XData),
- {result, []}
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ lists:foreach(fun ({Var, Vals}) ->
+ case Vals of
+ [<<"1">>] ->
+ Module = jlib:binary_to_atom(Var),
+ rpc:call(Node, gen_mod, stop_module,
+ [Host, Module]);
+ _ -> ok
+ end
+ end,
+ XData),
+ {result, []}
end;
-
-set_form(_From, Host, ["running nodes", ENode, "modules", "start"], _Lang, XData) ->
+set_form(_From, Host,
+ [<<"running nodes">>, ENode, <<"modules">>,
+ <<"start">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("modules", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, Strings}} ->
- String = lists:foldl(fun(S, Res) ->
- Res ++ S ++ "\n"
- end, "", Strings),
- case erl_scan:string(String) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, Modules} ->
- lists:foreach(
- fun({Module, Args}) ->
- rpc:call(Node,
- gen_mod,
- start_module,
- [Host, Module, Args])
- end, Modules),
- {result, []};
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"modules">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, 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, Modules} ->
+ lists:foreach(fun ({Module, Args}) ->
+ rpc:call(Node, gen_mod,
+ start_module,
+ [Host, Module, Args])
+ end,
+ Modules),
+ {result, []};
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
+ end
end;
-
-
-set_form(_From, _Host, ["running nodes", ENode, "backup", "backup"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"backup">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("path", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, [String]}} ->
- case rpc:call(Node, mnesia, backup, [String]) of
- {badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- {error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- _ ->
- {result, []}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"path">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, [String]}} ->
+ case rpc:call(Node, mnesia, backup, [String]) of
+ {badrpc, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR};
+ _ -> {result, []}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
end;
-
-
-set_form(_From, _Host, ["running nodes", ENode, "backup", "restore"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"restore">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("path", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, [String]}} ->
- case rpc:call(Node, ejabberd_admin, restore, [String]) of
- {badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- {error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- _ ->
- {result, []}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"path">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, [String]}} ->
+ case rpc:call(Node, ejabberd_admin, restore, [String])
+ of
+ {badrpc, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR};
+ _ -> {result, []}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
end;
-
-
-set_form(_From, _Host, ["running nodes", ENode, "backup", "textfile"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"backup">>,
+ <<"textfile">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("path", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, [String]}} ->
- case rpc:call(Node, ejabberd_admin, dump_to_textfile, [String]) of
- {badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- {error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- _ ->
- {result, []}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"path">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, [String]}} ->
+ case rpc:call(Node, ejabberd_admin, dump_to_textfile,
+ [String])
+ of
+ {badrpc, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR};
+ _ -> {result, []}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
end;
-
-
-set_form(_From, _Host, ["running nodes", ENode, "import", "file"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"import">>, <<"file">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("path", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, [String]}} ->
- rpc:call(Node, jd2ejd, import_file, [String]),
- {result, []};
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"path">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, [String]}} ->
+ rpc:call(Node, jd2ejd, import_file, [String]),
+ {result, []};
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
end;
-
-
-set_form(_From, _Host, ["running nodes", ENode, "import", "dir"], _Lang, XData) ->
+set_form(_From, _Host,
+ [<<"running nodes">>, ENode, <<"import">>, <<"dir">>],
+ _Lang, XData) ->
case search_running_node(ENode) of
- false ->
- {error, ?ERR_ITEM_NOT_FOUND};
- Node ->
- case lists:keysearch("path", 1, XData) of
- false ->
- {error, ?ERR_BAD_REQUEST};
- {value, {_, [String]}} ->
- rpc:call(Node, jd2ejd, import_dir, [String]),
- {result, []};
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end
+ false -> {error, ?ERR_ITEM_NOT_FOUND};
+ Node ->
+ case lists:keysearch(<<"path">>, 1, XData) of
+ false -> {error, ?ERR_BAD_REQUEST};
+ {value, {_, [String]}} ->
+ rpc:call(Node, jd2ejd, import_dir, [String]),
+ {result, []};
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end
end;
-
-set_form(From, Host, ["running nodes", ENode, "restart"], _Lang, XData) ->
+set_form(From, Host,
+ [<<"running nodes">>, ENode, <<"restart">>], _Lang,
+ XData) ->
stop_node(From, Host, ENode, restart, XData);
-
-set_form(From, Host, ["running nodes", ENode, "shutdown"], _Lang, XData) ->
+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 lists:keysearch("acls", 1, XData) of
- {value, {_, Strings}} ->
- String = lists:foldl(fun(S, Res) ->
- Res ++ S ++ "\n"
- end, "", Strings),
- case erl_scan:string(String) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, ACLs} ->
- case acl:add_list(Host, ACLs, true) of
- ok ->
- {result, []};
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
+set_form(_From, Host, [<<"config">>, <<"acls">>], _Lang,
+ XData) ->
+ case lists:keysearch(<<"acls">>, 1, XData) of
+ {value, {_, 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} ->
+ case acl:add_list(Host, ACLs, true) of
+ ok -> {result, []};
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
end;
-
-set_form(_From, Host, ["config", "access"], _Lang, XData) ->
- SetAccess =
- fun(Rs) ->
- mnesia:transaction(
- fun() ->
- Os = mnesia:select(config,
- [{{config, {access, '$1', '$2'}, '$3'},
- [{'==', '$2', Host}],
- ['$_']}]),
- lists:foreach(fun(O) ->
- mnesia:delete_object(O)
- end, Os),
- lists:foreach(
- fun({access, Name, Rules}) ->
- mnesia:write({config,
- {access, Name, Host},
- Rules})
- end, Rs)
- end)
- end,
- case lists:keysearch("access", 1, XData) of
- {value, {_, Strings}} ->
- String = lists:foldl(fun(S, Res) ->
- Res ++ S ++ "\n"
- end, "", Strings),
- case erl_scan:string(String) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, Rs} ->
- case SetAccess(Rs) of
- {atomic, _} ->
- {result, []};
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
- end;
- _ ->
- {error, ?ERR_BAD_REQUEST}
+set_form(_From, Host, [<<"config">>, <<"access">>],
+ _Lang, XData) ->
+ SetAccess = fun (Rs) ->
+ mnesia:transaction(fun () ->
+ Os = mnesia:select(config,
+ [{{config,
+ {access,
+ '$1',
+ '$2'},
+ '$3'},
+ [{'==',
+ '$2',
+ Host}],
+ ['$_']}]),
+ lists:foreach(fun (O) ->
+ mnesia:delete_object(O)
+ end,
+ Os),
+ lists:foreach(fun ({access,
+ Name,
+ Rules}) ->
+ mnesia:write({config,
+ {access,
+ Name,
+ Host},
+ Rules})
+ end,
+ Rs)
+ end)
+ end,
+ case lists:keysearch(<<"access">>, 1, XData) of
+ {value, {_, 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, []};
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
+ end;
+ _ -> {error, ?ERR_BAD_REQUEST}
end;
-
-set_form(From, Host, ?NS_ADMINL("add-user"), _Lang, XData) ->
- AccountString = get_value("accountjid", XData),
- Password = get_value("password", XData),
- Password = get_value("password-verify", XData),
+set_form(From, Host, ?NS_ADMINL(<<"add-user">>), _Lang,
+ XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
+ Password = get_value(<<"password">>, XData),
+ Password = get_value(<<"password-verify">>, XData),
AccountJID = jlib:string_to_jid(AccountString),
User = AccountJID#jid.luser,
Server = AccountJID#jid.lserver,
true = lists:member(Server, ?MYHOSTS),
- true = (Server == Host) orelse (get_permission_level(From) == global),
+ true = Server == Host orelse
+ get_permission_level(From) == global,
ejabberd_auth:try_register(User, Server, Password),
{result, []};
-
-set_form(From, Host, ?NS_ADMINL("delete-user"), _Lang, XData) ->
- AccountStringList = get_values("accountjids", XData),
- [_|_] = AccountStringList,
- ASL2 = lists:map(
- fun(AccountString) ->
- JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
- true = (Server == Host) orelse (get_permission_level(From) == global),
- true = ejabberd_auth:is_user_exists(User, Server),
- {User, Server}
- end,
- AccountStringList),
- [ejabberd_auth:remove_user(User, Server) || {User, Server} <- ASL2],
+set_form(From, Host, ?NS_ADMINL(<<"delete-user">>),
+ _Lang, XData) ->
+ AccountStringList = get_values(<<"accountjids">>,
+ XData),
+ [_ | _] = AccountStringList,
+ ASL2 = lists:map(fun (AccountString) ->
+ JID = jlib:string_to_jid(AccountString),
+ User = JID#jid.luser,
+ Server = JID#jid.lserver,
+ true = Server == Host orelse
+ get_permission_level(From) == global,
+ true = ejabberd_auth:is_user_exists(User, Server),
+ {User, Server}
+ end,
+ AccountStringList),
+ [ejabberd_auth:remove_user(User, Server)
+ || {User, Server} <- ASL2],
{result, []};
-
-set_form(From, Host, ?NS_ADMINL("end-user-session"), _Lang, XData) ->
- AccountString = get_value("accountjid", XData),
+set_form(From, Host, ?NS_ADMINL(<<"end-user-session">>),
+ _Lang, XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- LUser = JID#jid.luser,
- LServer = JID#jid.lserver,
- true = (LServer == Host) orelse (get_permission_level(From) == global),
- %% Code copied from ejabberd_sm.erl
+ LUser = JID#jid.luser,
+ LServer = JID#jid.lserver,
+ true = LServer == Host orelse
+ get_permission_level(From) == global,
case JID#jid.lresource of
- [] ->
- SIDs = mnesia:dirty_select(session,
- [{#session{sid = '$1', usr = {LUser, LServer, '_'}, _ = '_'}, [], ['$1']}]),
- [Pid ! replaced || {_, Pid} <- SIDs];
- R ->
- [{_, Pid}] = mnesia:dirty_select(session,
- [{#session{sid = '$1', usr = {LUser, LServer, R}, _ = '_'}, [], ['$1']}]),
- Pid ! replaced
- end,
+ <<>> ->
+ SIDs = mnesia:dirty_select(session,
+ [{#session{sid = '$1',
+ usr = {LUser, LServer, '_'},
+ _ = '_'},
+ [], ['$1']}]),
+ [Pid ! replaced || {_, Pid} <- SIDs];
+ R ->
+ [{_, Pid}] = mnesia:dirty_select(session,
+ [{#session{sid = '$1',
+ usr = {LUser, LServer, R},
+ _ = '_'},
+ [], ['$1']}]),
+ Pid ! replaced
+ end,
{result, []};
-
-set_form(From, Host, ?NS_ADMINL("get-user-password"), Lang, XData) ->
- AccountString = get_value("accountjid", XData),
+set_form(From, Host,
+ ?NS_ADMINL(<<"get-user-password">>), Lang, XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
- true = (Server == Host) orelse (get_permission_level(From) == global),
+ User = JID#jid.luser,
+ Server = JID#jid.lserver,
+ true = Server == Host orelse
+ get_permission_level(From) == global,
Password = ejabberd_auth:get_password(User, Server),
- true = is_list(Password),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- ?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
- ?XFIELD("text-single", "Password", "password", Password)
- ]}]};
-
-set_form(From, Host, ?NS_ADMINL("change-user-password"), _Lang, XData) ->
- AccountString = get_value("accountjid", XData),
- Password = get_value("password", XData),
+ true = is_binary(Password),
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ ?XFIELD(<<"jid-single">>, <<"Jabber ID">>,
+ <<"accountjid">>, AccountString),
+ ?XFIELD(<<"text-single">>, <<"Password">>,
+ <<"password">>, Password)]}]};
+set_form(From, Host,
+ ?NS_ADMINL(<<"change-user-password">>), _Lang, XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
+ Password = get_value(<<"password">>, XData),
JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
- true = (Server == Host) orelse (get_permission_level(From) == global),
+ User = JID#jid.luser,
+ Server = JID#jid.lserver,
+ true = Server == Host orelse
+ get_permission_level(From) == global,
true = ejabberd_auth:is_user_exists(User, Server),
ejabberd_auth:set_password(User, Server, Password),
{result, []};
-
-set_form(From, Host, ?NS_ADMINL("get-user-lastlogin"), Lang, XData) ->
- AccountString = get_value("accountjid", XData),
+set_form(From, Host,
+ ?NS_ADMINL(<<"get-user-lastlogin">>), Lang, XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
- true = (Server == Host) orelse (get_permission_level(From) == global),
-
- %% Code copied from web/ejabberd_web_admin.erl
- %% TODO: Update time format to XEP-0202: Entity Time
- FLast =
- case ejabberd_sm:get_user_resources(User, Server) of
- [] ->
- _US = {User, Server},
- case get_last_info(User, Server) of
- not_found ->
- ?T(Lang, "Never");
+ User = JID#jid.luser,
+ Server = JID#jid.lserver,
+ true = Server == Host orelse
+ get_permission_level(From) == global,
+ FLast = case ejabberd_sm:get_user_resources(User,
+ Server)
+ of
+ [] ->
+ _US = {User, Server},
+ case get_last_info(User, Server) of
+ not_found -> ?T(Lang, <<"Never">>);
{ok, Timestamp, _Status} ->
Shift = Timestamp,
- TimeStamp = {Shift div 1000000,
- Shift rem 1000000,
- 0},
+ TimeStamp = {Shift div 1000000, Shift rem 1000000, 0},
{{Year, Month, Day}, {Hour, Minute, Second}} =
calendar:now_to_local_time(TimeStamp),
- lists:flatten(
- io_lib:format(
- "~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
- [Year, Month, Day, Hour, Minute, Second]))
- end;
- _ ->
- ?T(Lang, "Online")
- end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
- [?HFIELD(),
- ?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
- ?XFIELD("text-single", "Last login", "lastlogin", FLast)
- ]}]};
-
-set_form(From, Host, ?NS_ADMINL("user-stats"), Lang, XData) ->
- AccountString = get_value("accountjid", XData),
+ iolist_to_binary(io_lib:format("~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
+ [Year, Month, Day, Hour,
+ Minute, Second]))
+ end;
+ _ -> ?T(Lang, <<"Online">>)
+ end,
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs =
+ [{<<"xmlns">>, ?NS_XDATA}, {<<"type">>, <<"result">>}],
+ children =
+ [?HFIELD(),
+ ?XFIELD(<<"jid-single">>, <<"Jabber ID">>,
+ <<"accountjid">>, AccountString),
+ ?XFIELD(<<"text-single">>, <<"Last login">>,
+ <<"lastlogin">>, FLast)]}]};
+set_form(From, Host, ?NS_ADMINL(<<"user-stats">>), Lang,
+ XData) ->
+ AccountString = get_value(<<"accountjid">>, XData),
JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
- true = (Server == Host) orelse (get_permission_level(From) == global),
-
- Resources = ejabberd_sm:get_user_resources(User, Server),
- IPs1 = [ejabberd_sm:get_user_ip(User, Server, Resource) || Resource <- Resources],
- IPs = [inet_parse:ntoa(IP)++":"++integer_to_list(Port) || {IP, Port} <- IPs1],
-
- Items = ejabberd_hooks:run_fold(roster_get, Server, [], [{User, Server}]),
- Rostersize = integer_to_list(erlang:length(Items)),
-
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- ?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
- ?XFIELD("text-single", "Roster size", "rostersize", Rostersize),
- ?XMFIELD("text-multi", "IP addresses", "ipaddresses", IPs),
- ?XMFIELD("text-multi", "Resources", "onlineresources", Resources)
- ]}]};
-
+ User = JID#jid.luser,
+ Server = JID#jid.lserver,
+ true = Server == Host orelse
+ get_permission_level(From) == global,
+ Resources = ejabberd_sm:get_user_resources(User,
+ Server),
+ IPs1 = [ejabberd_sm:get_user_ip(User, Server, Resource)
+ || Resource <- Resources],
+ IPs = [<<(jlib:ip_to_list(IP))/binary, ":",
+ (jlib:integer_to_binary(Port))/binary>>
+ || {IP, Port} <- IPs1],
+ Items = ejabberd_hooks:run_fold(roster_get, Server, [],
+ [{User, Server}]),
+ Rostersize = jlib:integer_to_binary(erlang:length(Items)),
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ ?XFIELD(<<"jid-single">>, <<"Jabber ID">>,
+ <<"accountjid">>, AccountString),
+ ?XFIELD(<<"text-single">>, <<"Roster size">>,
+ <<"rostersize">>, Rostersize),
+ ?XMFIELD(<<"text-multi">>, <<"IP addresses">>,
+ <<"ipaddresses">>, IPs),
+ ?XMFIELD(<<"text-multi">>, <<"Resources">>,
+ <<"onlineresources">>, Resources)]}]};
set_form(_From, _Host, _, _Lang, _XData) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
-get_value(Field, XData) ->
- hd(get_values(Field, XData)).
-get_values(Field, XData) ->
- {value, {_, ValueList}} = lists:keysearch(Field, 1, XData),
- ValueList.
+get_value(Field, XData) -> hd(get_values(Field, XData)).
+get_values(Field, XData) ->
+ {value, {_, ValueList}} = lists:keysearch(Field, 1,
+ XData),
+ ValueList.
search_running_node(SNode) ->
- search_running_node(SNode, mnesia:system_info(running_db_nodes)).
+ search_running_node(SNode,
+ mnesia:system_info(running_db_nodes)).
-search_running_node(_, []) ->
- false;
+search_running_node(_, []) -> false;
search_running_node(SNode, [Node | Nodes]) ->
- case atom_to_list(Node) of
- SNode ->
- Node;
- _ ->
- search_running_node(SNode, Nodes)
+ case iolist_to_binary(atom_to_list(Node)) of
+ SNode -> Node;
+ _ -> search_running_node(SNode, Nodes)
end.
stop_node(From, Host, ENode, Action, XData) ->
- Delay = list_to_integer(get_value("delay", XData)),
- Subject = case get_value("subject", XData) of
- [] -> [];
- S -> [{xmlelement, "field", [{"var","subject"}],
- [{xmlelement,"value",[],[{xmlcdata,S}]}]}]
+ Delay = jlib:binary_to_integer(get_value(<<"delay">>,
+ XData)),
+ Subject = case get_value(<<"subject">>, XData) of
+ <<"">> -> [];
+ S ->
+ [#xmlel{name = <<"field">>,
+ attrs = [{<<"var">>, <<"subject">>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, S}]}]}]
end,
- Announcement = case get_values("announcement", XData) of
- [] -> [];
- As -> [{xmlelement, "field", [{"var","body"}],
- [{xmlelement,"value",[],[{xmlcdata,Line}]} || Line <- As] }]
+ Announcement = case get_values(<<"announcement">>,
+ XData)
+ of
+ [] -> [];
+ As ->
+ [#xmlel{name = <<"field">>,
+ attrs = [{<<"var">>, <<"body">>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, Line}]}
+ || Line <- As]}]
end,
case Subject ++ Announcement of
- [] -> ok;
- SubEls ->
- Request = #adhoc_request{
- node = ?NS_ADMINX("announce-allhosts"),
- action = "complete",
- xdata = {xmlelement, "x",
- [{"xmlns","jabber:x:data"},{"type","submit"}],
- SubEls},
- others= [{xmlelement, "x",
- [{"xmlns","jabber:x:data"},{"type","submit"}],
- SubEls}]
- },
- To = jlib:make_jid("", Host, ""),
- mod_announce:announce_commands(empty, From, To, Request)
+ [] -> ok;
+ SubEls ->
+ Request = #adhoc_request{node =
+ ?NS_ADMINX(<<"announce-allhosts">>),
+ action = <<"complete">>,
+ xdata =
+ #xmlel{name = <<"x">>,
+ attrs =
+ [{<<"xmlns">>,
+ <<"jabber:x:data">>},
+ {<<"type">>, <<"submit">>}],
+ children = SubEls},
+ others =
+ [#xmlel{name = <<"x">>,
+ attrs =
+ [{<<"xmlns">>,
+ <<"jabber:x:data">>},
+ {<<"type">>, <<"submit">>}],
+ children = SubEls}]},
+ To = jlib:make_jid(<<"">>, Host, <<"">>),
+ mod_announce:announce_commands(empty, From, To, Request)
end,
Time = timer:seconds(Delay),
- Node = list_to_atom(ENode),
- {ok, _} = timer:apply_after(Time, rpc, call, [Node, init, Action, []]),
+ Node = jlib:binary_to_atom(ENode),
+ {ok, _} = timer:apply_after(Time, rpc, call,
+ [Node, init, Action, []]),
{result, []}.
-
get_last_info(User, Server) ->
case gen_mod:is_loaded(Server, mod_last) of
- true ->
- mod_last:get_last_info(User, Server);
- false ->
- not_found
+ true -> mod_last:get_last_info(User, Server);
+ false -> not_found
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
adhoc_sm_commands(_Acc, From,
- #jid{user = User, server = Server, lserver = LServer} = _To,
- #adhoc_request{lang = Lang,
- node = "config",
- action = Action,
- xdata = XData} = Request) ->
+ #jid{user = User, server = Server, lserver = LServer} =
+ _To,
+ #adhoc_request{lang = Lang, node = <<"config">>,
+ action = Action, xdata = XData} =
+ Request) ->
case acl:match_rule(LServer, configure, From) of
- deny ->
- {error, ?ERR_FORBIDDEN};
- allow ->
- %% If the "action" attribute is not present, it is
- %% understood as "execute". If there was no <actions/>
- %% element in the first response (which there isn't in our
- %% case), "execute" and "complete" are equivalent.
- ActionIsExecute = lists:member(Action,
- ["", "execute", "complete"]),
- if Action == "cancel" ->
- %% User cancels request
- adhoc:produce_response(
- Request,
- #adhoc_response{status = canceled});
- XData == false, ActionIsExecute ->
- %% User requests form
- case get_sm_form(User, Server, "config", Lang) of
- {result, Form} ->
- adhoc:produce_response(
- Request,
- #adhoc_response{status = executing,
- elements = Form});
- {error, Error} ->
- {error, Error}
- end;
- XData /= false, ActionIsExecute ->
- %% User returns form.
- case jlib:parse_xdata_submit(XData) of
- invalid ->
- {error, ?ERR_BAD_REQUEST};
- Fields ->
- set_sm_form(User, Server, "config", Request, Fields)
- end;
- true ->
- {error, ?ERR_BAD_REQUEST}
- end
+ deny -> {error, ?ERR_FORBIDDEN};
+ allow ->
+ ActionIsExecute = lists:member(Action,
+ [<<"">>, <<"execute">>,
+ <<"complete">>]),
+ if Action == <<"cancel">> ->
+ adhoc:produce_response(Request,
+ #adhoc_response{status = canceled});
+ XData == false, ActionIsExecute ->
+ case get_sm_form(User, Server, <<"config">>, Lang) of
+ {result, Form} ->
+ adhoc:produce_response(Request,
+ #adhoc_response{status =
+ executing,
+ elements = Form});
+ {error, Error} -> {error, Error}
+ end;
+ XData /= false, ActionIsExecute ->
+ case jlib:parse_xdata_submit(XData) of
+ invalid -> {error, ?ERR_BAD_REQUEST};
+ Fields ->
+ set_sm_form(User, Server, <<"config">>, Request, Fields)
+ end;
+ true -> {error, ?ERR_BAD_REQUEST}
+ end
end;
+adhoc_sm_commands(Acc, _From, _To, _Request) -> Acc.
-adhoc_sm_commands(Acc, _From, _To, _Request) ->
- Acc.
-
-get_sm_form(User, Server, "config", Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Administration of ") ++ User}]},
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", ?T(Lang, "Action on user")},
- {"var", "action"}],
- [{xmlelement, "value", [], [{xmlcdata, "edit"}]},
- {xmlelement, "option",
- [{"label", ?T(Lang, "Edit Properties")}],
- [{xmlelement, "value", [], [{xmlcdata, "edit"}]}]},
- {xmlelement, "option",
- [{"label", ?T(Lang, "Remove User")}],
- [{xmlelement, "value", [], [{xmlcdata, "remove"}]}]}
- ]},
- ?XFIELD("text-private", "Password", "password",
- ejabberd_auth:get_password_s(User, Server))
- ]}]};
-
+get_sm_form(User, Server, <<"config">>, Lang) ->
+ {result,
+ [#xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_XDATA}],
+ children =
+ [?HFIELD(),
+ #xmlel{name = <<"title">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<(?T(Lang, <<"Administration of ">>))/binary,
+ User/binary>>}]},
+ #xmlel{name = <<"field">>,
+ attrs =
+ [{<<"type">>, <<"list-single">>},
+ {<<"label">>, ?T(Lang, <<"Action on user">>)},
+ {<<"var">>, <<"action">>}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children = [{xmlcdata, <<"edit">>}]},
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>,
+ ?T(Lang, <<"Edit Properties">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<"edit">>}]}]},
+ #xmlel{name = <<"option">>,
+ attrs =
+ [{<<"label">>,
+ ?T(Lang, <<"Remove User">>)}],
+ children =
+ [#xmlel{name = <<"value">>, attrs = [],
+ children =
+ [{xmlcdata,
+ <<"remove">>}]}]}]},
+ ?XFIELD(<<"text-private">>, <<"Password">>,
+ <<"password">>,
+ (ejabberd_auth:get_password_s(User, Server)))]}]};
get_sm_form(_User, _Server, _Node, _Lang) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
-
-set_sm_form(User, Server, "config",
- #adhoc_request{lang = Lang,
- node = Node,
- sessionid = SessionID}, XData) ->
- Response = #adhoc_response{lang = Lang,
- node = Node,
- sessionid = SessionID,
- status = completed},
- case lists:keysearch("action", 1, XData) of
- {value, {_, ["edit"]}} ->
- case lists:keysearch("password", 1, XData) of
- {value, {_, [Password]}} ->
- ejabberd_auth:set_password(User, Server, Password),
- adhoc:produce_response(Response);
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
- end;
- {value, {_, ["remove"]}} ->
- catch ejabberd_auth:remove_user(User, Server),
- adhoc:produce_response(Response);
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+set_sm_form(User, Server, <<"config">>,
+ #adhoc_request{lang = Lang, node = Node,
+ sessionid = SessionID},
+ XData) ->
+ Response = #adhoc_response{lang = Lang, node = Node,
+ sessionid = SessionID, status = completed},
+ case lists:keysearch(<<"action">>, 1, XData) of
+ {value, {_, [<<"edit">>]}} ->
+ case lists:keysearch(<<"password">>, 1, XData) of
+ {value, {_, [Password]}} ->
+ ejabberd_auth:set_password(User, Server, Password),
+ adhoc:produce_response(Response);
+ _ -> {error, ?ERR_NOT_ACCEPTABLE}
+ end;
+ {value, {_, [<<"remove">>]}} ->
+ catch ejabberd_auth:remove_user(User, Server),
+ adhoc:produce_response(Response);
+ _ -> {error, ?ERR_NOT_ACCEPTABLE}
end;
-
set_sm_form(_User, _Server, _Node, _Request, _Fields) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
-
-
-