From 0291cac0f55e6ae9e5285a45e1cb6946a3188e3c Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 29 Sep 2005 01:04:24 +0000 Subject: [PATCH] * 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 --- ChangeLog | 9 +++ src/mod_offline.erl | 2 +- src/mod_shared_roster.erl | 16 ++++- src/web/ejabberd_web_admin.erl | 111 +++++++++++++++++++++------------ 4 files changed, 96 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5b74856b5..7ec307614 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-09-18 Alexey Shchepin + + * 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 * src/jlib.erl: Bugfix diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 5b70650a8..b86c0bc91 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -145,7 +145,7 @@ check_event(From, To, Packet) -> {xmlelement, "offline", [], []}]}] }), true - end; + end; _ -> false end diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index f610305c8..90bb3c007 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -25,6 +25,7 @@ get_group_opts/2, set_group_opts/3, get_group_users/2, + get_group_explicit_users/2, add_user_to_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]; _ -> [] - end. + end ++ get_all_users_groups(Host). is_group_enabled(Host, Group) -> case catch mnesia:dirty_read(sr_group, {Group, Host}) of @@ -250,6 +251,14 @@ get_group_opt(Host, Group, Opt, Default) -> end. 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( sr_user, {Group, Host}, #sr_user.group_host) of Rs when is_list(Rs) -> @@ -261,6 +270,11 @@ get_group_users(Host, Group) -> get_group_name(Host, 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) -> Host = element(2, US), DisplayedGroups1 = diff --git a/src/web/ejabberd_web_admin.erl b/src/web/ejabberd_web_admin.erl index 322adde37..0ed317a0c 100644 --- a/src/web/ejabberd_web_admin.erl +++ b/src/web/ejabberd_web_admin.erl @@ -14,7 +14,9 @@ -vsn('$Revision$ '). %% External exports --export([process_admin/2]). +-export([process_admin/2, + list_users/4, + list_users_in_diapason/4]). -include("ejabberd.hrl"). -include("jlib.hrl"). @@ -836,7 +838,7 @@ process_admin(Host, path = ["users"], q = Query, 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); process_admin(Host, @@ -844,7 +846,7 @@ process_admin(Host, path = ["users", Diap], q = Query, 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); process_admin(Host, @@ -954,7 +956,7 @@ process_admin(Host, path = ["shared-roster"], q = Query, lang = Lang} = Request) -> - Res = list_shared_roster_groups(Query, Lang), + Res = list_shared_roster_groups(Host, Query, Lang), make_xhtml(Res, Host, Lang); process_admin(Host, @@ -962,7 +964,7 @@ process_admin(Host, path = ["shared-roster", Group], q = Query, lang = Lang} = Request) -> - Res = shared_roster_group(Group, Query, Lang), + Res = shared_roster_group(Host, Group, Query, Lang), make_xhtml(Res, Host, Lang); 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), Users = ejabberd_auth:get_vh_registered_users(Host), SUsers = lists:sort([{S, U} || {U, S} <- Users]), FUsers = case length(SUsers) of N when N =< 100 -> - [list_given_users(SUsers, "../", Lang)]; + [list_given_users(SUsers, "../", Lang, URLFunc)]; N -> NParts = trunc(math:sqrt(N * 0.618)) + 1, M = trunc(N / NParts) + 1, @@ -1246,7 +1248,7 @@ list_users(Host, Query, Lang) -> su_to_list(lists:nth(K, SUsers)) ++ [$\s, 226, 128, 148, $\s] ++ Last, - [?AC(Node ++ "/", Name), ?BR] + [?AC(URLFunc({user_diapason, K, L}), Name), ?BR] end, lists:seq(1, N, M)) end, case Res of @@ -1295,16 +1297,16 @@ list_users_parse_query(Query) -> end. -list_users_in_diapason(Host, Diap, Lang) -> +list_users_in_diapason(Host, Diap, Lang, URLFunc) -> Users = ejabberd_auth:get_vh_registered_users(Host), SUsers = lists:sort([{S, U} || {U, S} <- Users]), {ok, [S1, S2]} = regexp:split(Diap, "-"), N1 = list_to_integer(S1), N2 = list_to_integer(S2), 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("thead", [?XE("tr", @@ -1316,8 +1318,8 @@ list_given_users(Users, Prefix, Lang) -> fun(SU = {Server, User}) -> US = {User, Server}, QueueLen = length(mnesia:dirty_read({offline_msg, US})), - FQueueLen = [?AC(Prefix ++ "user/" ++ - User ++ "/queue/", + FQueueLen = [?AC(URLFunc({users_queue, Prefix, + User, Server}), integer_to_list(QueueLen))], FLast = case ejabberd_sm:get_user_resources(User, Server) of @@ -1341,7 +1343,7 @@ list_given_users(Users, Prefix, Lang) -> ?T("Online") end, ?XE("tr", - [?XE("td", [?AC(Prefix ++ "user/" ++ User ++ "/", + [?XE("td", [?AC(URLFunc({user, Prefix, User, Server}), us_to_list(US))]), ?XE("td", FQueueLen), ?XC("td", FLast)]) @@ -2355,9 +2357,9 @@ pretty_print({xmlelement, Name, Attrs, Els}, Prefix) -> end]. -list_shared_roster_groups(Query, Lang) -> - Res = list_sr_groups_parse_query(Query), - SRGroups = mod_shared_roster:list_groups(?MYNAME), +list_shared_roster_groups(Host, Query, Lang) -> + Res = list_sr_groups_parse_query(Host, Query), + SRGroups = mod_shared_roster:list_groups(Host), FGroups = ?XAE("table", [], [?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 {value, _} -> - list_sr_groups_parse_addnew(Query); + list_sr_groups_parse_addnew(Host, Query); _ -> case lists:keysearch("delete", 1, Query) of {value, _} -> - list_sr_groups_parse_delete(Query); + list_sr_groups_parse_delete(Host, Query); _ -> nothing end end. -list_sr_groups_parse_addnew(Query) -> +list_sr_groups_parse_addnew(Host, Query) -> case lists:keysearch("namenew", 1, Query) of {value, {_, Group}} when Group /= "" -> - mod_shared_roster:create_group(?MYNAME, Group), + mod_shared_roster:create_group(Host, Group), ok; _ -> error end. -list_sr_groups_parse_delete(Query) -> - SRGroups = mod_shared_roster:list_groups(?MYNAME), +list_sr_groups_parse_delete(Host, Query) -> + SRGroups = mod_shared_roster:list_groups(Host), lists:foreach( fun(Group) -> case lists:member({"selected", Group}, Query) of true -> - mod_shared_roster:delete_group(?MYNAME, Group); + mod_shared_roster:delete_group(Host, Group); _ -> ok end @@ -2426,15 +2428,22 @@ list_sr_groups_parse_delete(Query) -> ok. -shared_roster_group(Group, Query, Lang) -> - Res = shared_roster_group_parse_query(?MYNAME, Group, Query), - GroupOpts = mod_shared_roster:get_group_opts(?MYNAME, Group), +shared_roster_group(Host, Group, Query, Lang) -> + Res = shared_roster_group_parse_query(Host, Group, Query), + GroupOpts = mod_shared_roster:get_group_opts(Host, Group), Name = get_opt(GroupOpts, name, ""), Description = get_opt(GroupOpts, description, ""), - Members = mod_shared_roster:get_group_users(?MYNAME, Group), + AllUsers = get_opt(GroupOpts, all_users, false), Disabled = false, 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], FGroup = ?XAE("table", [], @@ -2506,21 +2515,36 @@ shared_roster_group_parse_query(Host, Group, Query) -> DispGroups == [] -> []; true -> [{displayed_groups, DispGroups}] 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 = lists:foldl( fun(_SJID, error) -> error; (SJID, USs) -> - case jlib:string_to_jid(SJID) of - JID when is_record(JID, jid) -> - [{JID#jid.luser, JID#jid.lserver} | USs]; - error -> - error + case SJID of + "@all@" -> + USs; + _ -> + 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, [], 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 NewMembers == error -> error; true -> @@ -2543,7 +2567,6 @@ shared_roster_group_parse_query(Host, Group, Query) -> end. - get_opt(Opts, Opt, Default) -> case lists:keysearch(Opt, 1, Opts) of {value, {_, Val}} -> @@ -2552,3 +2575,11 @@ get_opt(Opts, Opt, Default) -> Default 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 ++ "/". +