* src/web/ejabberd_web_admin.erl: Updated API for better

integration with J-EAI web interface

* src/mod_shared_roster.erl: Now possible to specify all users on
virtual host in group
* src/web/ejabberd_web_admin.erl: Likewise

SVN Revision: 413
This commit is contained in:
Alexey Shchepin 2005-09-29 01:04:24 +00:00
parent 0b51f0488f
commit 0291cac0f5
4 changed files with 96 additions and 42 deletions

View File

@ -1,3 +1,12 @@
2005-09-18 Alexey Shchepin <alexey@sevcom.net>
* src/web/ejabberd_web_admin.erl: Updated API for better
integration with J-EAI web interface
* src/mod_shared_roster.erl: Now possible to specify all users on
virtual host in group
* src/web/ejabberd_web_admin.erl: Likewise
2005-09-15 Alexey Shchepin <alexey@sevcom.net> 2005-09-15 Alexey Shchepin <alexey@sevcom.net>
* src/jlib.erl: Bugfix * src/jlib.erl: Bugfix

View File

@ -145,7 +145,7 @@ check_event(From, To, Packet) ->
{xmlelement, "offline", [], []}]}] {xmlelement, "offline", [], []}]}]
}), }),
true true
end; end;
_ -> _ ->
false false
end end

View File

@ -25,6 +25,7 @@
get_group_opts/2, get_group_opts/2,
set_group_opts/3, set_group_opts/3,
get_group_users/2, get_group_users/2,
get_group_explicit_users/2,
add_user_to_group/3, add_user_to_group/3,
remove_user_from_group/3]). remove_user_from_group/3]).
@ -226,7 +227,7 @@ get_user_groups(US) ->
[Group || #sr_user{group_host = {Group, H}} <- Rs, H == Host]; [Group || #sr_user{group_host = {Group, H}} <- Rs, H == Host];
_ -> _ ->
[] []
end. end ++ get_all_users_groups(Host).
is_group_enabled(Host, Group) -> is_group_enabled(Host, Group) ->
case catch mnesia:dirty_read(sr_group, {Group, Host}) of case catch mnesia:dirty_read(sr_group, {Group, Host}) of
@ -250,6 +251,14 @@ get_group_opt(Host, Group, Opt, Default) ->
end. end.
get_group_users(Host, Group) -> get_group_users(Host, Group) ->
case get_group_opt(Host, Group, all_users, false) of
true ->
ejabberd_auth:get_vh_registered_users(Host);
false ->
[]
end ++ get_group_explicit_users(Host, Group).
get_group_explicit_users(Host, Group) ->
case catch mnesia:dirty_index_read( case catch mnesia:dirty_index_read(
sr_user, {Group, Host}, #sr_user.group_host) of sr_user, {Group, Host}, #sr_user.group_host) of
Rs when is_list(Rs) -> Rs when is_list(Rs) ->
@ -261,6 +270,11 @@ get_group_users(Host, Group) ->
get_group_name(Host, Group) -> get_group_name(Host, Group) ->
get_group_opt(Host, Group, name, Group). get_group_opt(Host, Group, name, Group).
get_all_users_groups(Host) ->
lists:filter(
fun(Group) -> get_group_opt(Host, Group, all_users, false) end,
list_groups(Host)).
get_user_displayed_groups(US) -> get_user_displayed_groups(US) ->
Host = element(2, US), Host = element(2, US),
DisplayedGroups1 = DisplayedGroups1 =

View File

@ -14,7 +14,9 @@
-vsn('$Revision$ '). -vsn('$Revision$ ').
%% External exports %% External exports
-export([process_admin/2]). -export([process_admin/2,
list_users/4,
list_users_in_diapason/4]).
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include("jlib.hrl"). -include("jlib.hrl").
@ -836,7 +838,7 @@ process_admin(Host,
path = ["users"], path = ["users"],
q = Query, q = Query,
lang = Lang} = Request) when is_list(Host) -> lang = Lang} = Request) when is_list(Host) ->
Res = list_users(Host, Query, Lang), Res = list_users(Host, Query, Lang, fun url_func/1),
make_xhtml([?XCT("h1", "ejabberd users")] ++ Res, Host, Lang); make_xhtml([?XCT("h1", "ejabberd users")] ++ Res, Host, Lang);
process_admin(Host, process_admin(Host,
@ -844,7 +846,7 @@ process_admin(Host,
path = ["users", Diap], path = ["users", Diap],
q = Query, q = Query,
lang = Lang} = Request) when is_list(Host) -> lang = Lang} = Request) when is_list(Host) ->
Res = list_users_in_diapason(Host, Diap, Lang), Res = list_users_in_diapason(Host, Diap, Lang, fun url_func/1),
make_xhtml([?XCT("h1", "ejabberd users")] ++ Res, Host, Lang); make_xhtml([?XCT("h1", "ejabberd users")] ++ Res, Host, Lang);
process_admin(Host, process_admin(Host,
@ -954,7 +956,7 @@ process_admin(Host,
path = ["shared-roster"], path = ["shared-roster"],
q = Query, q = Query,
lang = Lang} = Request) -> lang = Lang} = Request) ->
Res = list_shared_roster_groups(Query, Lang), Res = list_shared_roster_groups(Host, Query, Lang),
make_xhtml(Res, Host, Lang); make_xhtml(Res, Host, Lang);
process_admin(Host, process_admin(Host,
@ -962,7 +964,7 @@ process_admin(Host,
path = ["shared-roster", Group], path = ["shared-roster", Group],
q = Query, q = Query,
lang = Lang} = Request) -> lang = Lang} = Request) ->
Res = shared_roster_group(Group, Query, Lang), Res = shared_roster_group(Host, Group, Query, Lang),
make_xhtml(Res, Host, Lang); make_xhtml(Res, Host, Lang);
process_admin(Host, process_admin(Host,
@ -1224,14 +1226,14 @@ list_vhosts(Lang) ->
)])]. )])].
list_users(Host, Query, Lang) -> list_users(Host, Query, Lang, URLFunc) ->
Res = list_users_parse_query(Query), Res = list_users_parse_query(Query),
Users = ejabberd_auth:get_vh_registered_users(Host), Users = ejabberd_auth:get_vh_registered_users(Host),
SUsers = lists:sort([{S, U} || {U, S} <- Users]), SUsers = lists:sort([{S, U} || {U, S} <- Users]),
FUsers = FUsers =
case length(SUsers) of case length(SUsers) of
N when N =< 100 -> N when N =< 100 ->
[list_given_users(SUsers, "../", Lang)]; [list_given_users(SUsers, "../", Lang, URLFunc)];
N -> N ->
NParts = trunc(math:sqrt(N * 0.618)) + 1, NParts = trunc(math:sqrt(N * 0.618)) + 1,
M = trunc(N / NParts) + 1, M = trunc(N / NParts) + 1,
@ -1246,7 +1248,7 @@ list_users(Host, Query, Lang) ->
su_to_list(lists:nth(K, SUsers)) ++ su_to_list(lists:nth(K, SUsers)) ++
[$\s, 226, 128, 148, $\s] ++ [$\s, 226, 128, 148, $\s] ++
Last, Last,
[?AC(Node ++ "/", Name), ?BR] [?AC(URLFunc({user_diapason, K, L}), Name), ?BR]
end, lists:seq(1, N, M)) end, lists:seq(1, N, M))
end, end,
case Res of case Res of
@ -1295,16 +1297,16 @@ list_users_parse_query(Query) ->
end. end.
list_users_in_diapason(Host, Diap, Lang) -> list_users_in_diapason(Host, Diap, Lang, URLFunc) ->
Users = ejabberd_auth:get_vh_registered_users(Host), Users = ejabberd_auth:get_vh_registered_users(Host),
SUsers = lists:sort([{S, U} || {U, S} <- Users]), SUsers = lists:sort([{S, U} || {U, S} <- Users]),
{ok, [S1, S2]} = regexp:split(Diap, "-"), {ok, [S1, S2]} = regexp:split(Diap, "-"),
N1 = list_to_integer(S1), N1 = list_to_integer(S1),
N2 = list_to_integer(S2), N2 = list_to_integer(S2),
Sub = lists:sublist(SUsers, N1, N2 - N1 + 1), Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
[list_given_users(Sub, "../../", Lang)]. [list_given_users(Sub, "../../", Lang, URLFunc)].
list_given_users(Users, Prefix, Lang) -> list_given_users(Users, Prefix, Lang, URLFunc) ->
?XE("table", ?XE("table",
[?XE("thead", [?XE("thead",
[?XE("tr", [?XE("tr",
@ -1316,8 +1318,8 @@ list_given_users(Users, Prefix, Lang) ->
fun(SU = {Server, User}) -> fun(SU = {Server, User}) ->
US = {User, Server}, US = {User, Server},
QueueLen = length(mnesia:dirty_read({offline_msg, US})), QueueLen = length(mnesia:dirty_read({offline_msg, US})),
FQueueLen = [?AC(Prefix ++ "user/" ++ FQueueLen = [?AC(URLFunc({users_queue, Prefix,
User ++ "/queue/", User, Server}),
integer_to_list(QueueLen))], integer_to_list(QueueLen))],
FLast = FLast =
case ejabberd_sm:get_user_resources(User, Server) of case ejabberd_sm:get_user_resources(User, Server) of
@ -1341,7 +1343,7 @@ list_given_users(Users, Prefix, Lang) ->
?T("Online") ?T("Online")
end, end,
?XE("tr", ?XE("tr",
[?XE("td", [?AC(Prefix ++ "user/" ++ User ++ "/", [?XE("td", [?AC(URLFunc({user, Prefix, User, Server}),
us_to_list(US))]), us_to_list(US))]),
?XE("td", FQueueLen), ?XE("td", FQueueLen),
?XC("td", FLast)]) ?XC("td", FLast)])
@ -2355,9 +2357,9 @@ pretty_print({xmlelement, Name, Attrs, Els}, Prefix) ->
end]. end].
list_shared_roster_groups(Query, Lang) -> list_shared_roster_groups(Host, Query, Lang) ->
Res = list_sr_groups_parse_query(Query), Res = list_sr_groups_parse_query(Host, Query),
SRGroups = mod_shared_roster:list_groups(?MYNAME), SRGroups = mod_shared_roster:list_groups(Host),
FGroups = FGroups =
?XAE("table", [], ?XAE("table", [],
[?XE("tbody", [?XE("tbody",
@ -2390,35 +2392,35 @@ list_shared_roster_groups(Query, Lang) ->
]) ])
]. ].
list_sr_groups_parse_query(Query) -> list_sr_groups_parse_query(Host, Query) ->
case lists:keysearch("addnew", 1, Query) of case lists:keysearch("addnew", 1, Query) of
{value, _} -> {value, _} ->
list_sr_groups_parse_addnew(Query); list_sr_groups_parse_addnew(Host, Query);
_ -> _ ->
case lists:keysearch("delete", 1, Query) of case lists:keysearch("delete", 1, Query) of
{value, _} -> {value, _} ->
list_sr_groups_parse_delete(Query); list_sr_groups_parse_delete(Host, Query);
_ -> _ ->
nothing nothing
end end
end. end.
list_sr_groups_parse_addnew(Query) -> list_sr_groups_parse_addnew(Host, Query) ->
case lists:keysearch("namenew", 1, Query) of case lists:keysearch("namenew", 1, Query) of
{value, {_, Group}} when Group /= "" -> {value, {_, Group}} when Group /= "" ->
mod_shared_roster:create_group(?MYNAME, Group), mod_shared_roster:create_group(Host, Group),
ok; ok;
_ -> _ ->
error error
end. end.
list_sr_groups_parse_delete(Query) -> list_sr_groups_parse_delete(Host, Query) ->
SRGroups = mod_shared_roster:list_groups(?MYNAME), SRGroups = mod_shared_roster:list_groups(Host),
lists:foreach( lists:foreach(
fun(Group) -> fun(Group) ->
case lists:member({"selected", Group}, Query) of case lists:member({"selected", Group}, Query) of
true -> true ->
mod_shared_roster:delete_group(?MYNAME, Group); mod_shared_roster:delete_group(Host, Group);
_ -> _ ->
ok ok
end end
@ -2426,15 +2428,22 @@ list_sr_groups_parse_delete(Query) ->
ok. ok.
shared_roster_group(Group, Query, Lang) -> shared_roster_group(Host, Group, Query, Lang) ->
Res = shared_roster_group_parse_query(?MYNAME, Group, Query), Res = shared_roster_group_parse_query(Host, Group, Query),
GroupOpts = mod_shared_roster:get_group_opts(?MYNAME, Group), GroupOpts = mod_shared_roster:get_group_opts(Host, Group),
Name = get_opt(GroupOpts, name, ""), Name = get_opt(GroupOpts, name, ""),
Description = get_opt(GroupOpts, description, ""), Description = get_opt(GroupOpts, description, ""),
Members = mod_shared_roster:get_group_users(?MYNAME, Group), AllUsers = get_opt(GroupOpts, all_users, false),
Disabled = false, Disabled = false,
DisplayedGroups = get_opt(GroupOpts, displayed_groups, []), DisplayedGroups = get_opt(GroupOpts, displayed_groups, []),
FMembers = [[us_to_list(Member), $\n] || Member <- Members], Members = mod_shared_roster:get_group_explicit_users(Host, Group),
FMembers =
if
AllUsers ->
"@all@\n";
true ->
[]
end ++ [[us_to_list(Member), $\n] || Member <- Members],
FDisplayedGroups = [[DG, $\n] || DG <- DisplayedGroups], FDisplayedGroups = [[DG, $\n] || DG <- DisplayedGroups],
FGroup = FGroup =
?XAE("table", [], ?XAE("table", [],
@ -2506,21 +2515,36 @@ shared_roster_group_parse_query(Host, Group, Query) ->
DispGroups == [] -> []; DispGroups == [] -> [];
true -> [{displayed_groups, DispGroups}] true -> [{displayed_groups, DispGroups}]
end, end,
mod_shared_roster:set_group_opts(
?MYNAME, Group, NameOpt ++ DispGroupsOpt ++ DescriptionOpt),
OldMembers = mod_shared_roster:get_group_users(?MYNAME, Group), OldMembers = mod_shared_roster:get_group_explicit_users(
Host, Group),
SJIDs = string:tokens(SMembers, "\r\n"),
NewMembers = NewMembers =
lists:foldl( lists:foldl(
fun(_SJID, error) -> error; fun(_SJID, error) -> error;
(SJID, USs) -> (SJID, USs) ->
case jlib:string_to_jid(SJID) of case SJID of
JID when is_record(JID, jid) -> "@all@" ->
[{JID#jid.luser, JID#jid.lserver} | USs]; USs;
error -> _ ->
error case jlib:string_to_jid(SJID) of
JID when is_record(JID, jid) ->
[{JID#jid.luser, JID#jid.lserver} | USs];
error ->
error
end
end end
end, [], string:tokens(SMembers, "\r\n")), end, [], SJIDs),
AllUsersOpt =
case lists:member("@all@", SJIDs) of
true -> [{all_users, true}];
false -> []
end,
mod_shared_roster:set_group_opts(
Host, Group,
NameOpt ++ DispGroupsOpt ++ DescriptionOpt ++ AllUsersOpt),
if if
NewMembers == error -> error; NewMembers == error -> error;
true -> true ->
@ -2543,7 +2567,6 @@ shared_roster_group_parse_query(Host, Group, Query) ->
end. end.
get_opt(Opts, Opt, Default) -> get_opt(Opts, Opt, Default) ->
case lists:keysearch(Opt, 1, Opts) of case lists:keysearch(Opt, 1, Opts) of
{value, {_, Val}} -> {value, {_, Val}} ->
@ -2552,3 +2575,11 @@ get_opt(Opts, Opt, Default) ->
Default Default
end. end.
url_func({user_diapason, From, To}) ->
integer_to_list(From) ++ "-" ++ integer_to_list(To) ++ "/";
url_func({users_queue, Prefix, User, Server}) ->
Prefix ++ "user/" ++ User ++ "/queue/";
url_func({user, Prefix, User, Server}) ->
Prefix ++ "user/" ++ User ++ "/".