Index: src/mod_shared_roster.erl =================================================================== --- src/mod_shared_roster.erl (revisión: 969) +++ src/mod_shared_roster.erl (copia de trabajo) @@ -27,6 +27,8 @@ set_group_opts/3, get_group_users/2, get_group_explicit_users/2, + add_acl/2, + add_acl_start/4, add_user_to_group/3, remove_user_from_group/3]). @@ -39,7 +41,7 @@ -record(sr_group, {group_host, opts}). -record(sr_user, {us, group_host}). -start(Host, _Opts) -> +start(Host, Opts) -> mnesia:create_table(sr_group, [{disc_copies, [node()]}, {attributes, record_info(fields, sr_group)}]), @@ -48,6 +50,16 @@ {type, bag}, {attributes, record_info(fields, sr_user)}]), mnesia:add_table_index(sr_user, group_host), + case gen_mod:get_opt(add_acl, Opts, none) of + {Access, Group, Server} -> + ejabberd_hooks:add(roster_get, Host, ?MODULE, add_acl, 65), + add_acl_start(Host, Access, Group, Server); + List_AGS when is_list(List_AGS) -> + ejabberd_hooks:add(roster_get, Host, ?MODULE, add_acl, 65), + [add_acl_start(Host, Access, Group, Server) + || {Access, Group, Server} <- List_AGS]; + _ -> ok + end, ejabberd_hooks:add(webadmin_menu_host, Host, ?MODULE, webadmin_menu, 70), ejabberd_hooks:add(webadmin_page_host, Host, @@ -68,6 +80,10 @@ % ?MODULE, remove_user, 50), stop(Host) -> + case gen_mod:get_module_opt(Host, ?MODULE, add_acl, false) of + {_, _, _} -> ejabberd_hooks:delete(roster_get, Host, ?MODULE, add_acl, 65); + _ -> ok + end, ejabberd_hooks:delete(webadmin_menu_host, Host, ?MODULE, webadmin_menu, 70), ejabberd_hooks:delete(webadmin_page_host, Host, @@ -125,13 +141,28 @@ SRItems = [#roster{usj = {U, S, {U1, S1, ""}}, us = US, jid = {U1, S1, ""}, - name = "", + name = get_rosteritem_name(U1, S1), subscription = both, ask = none, groups = GroupNames} || {{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)], SRItems ++ NewItems1. +get_rosteritem_name(U, S) -> + From = jlib:make_jid("", S, mod_shared_roster), + To = jlib:make_jid(U, S, ""), + IQ = {iq,"",get,"vcard-temp","", + {xmlelement,"vCard",[{"xmlns","vcard-temp"}],[]}}, + IQ_Vcard = mod_vcard:process_sm_iq(From, To, IQ), + case IQ_Vcard#iq.sub_el of + [] -> ""; + [Vcard] -> + case xml:get_path_s(Vcard, [{elem, "NICKNAME"}, cdata]) of + "" -> xml:get_path_s(Vcard, [{elem, "FN"}, cdata]); + Nickname -> Nickname + end + end. + %% This function in use to rewrite the roster entries when moving or renaming %% them in the user contact list. process_item(RosterItem, Host) -> @@ -364,7 +395,30 @@ end, mnesia:transaction(F). +check_acl_and_add({U, S}, {Access, Group, Server}) -> + JID = {U, S, ""}, + case acl:match_rule(S, Access, JID) of + allow -> add_user_to_group(Server, {U, S}, Group); + deny -> io:format("sr: NO '~p'~n", [JID]) + end. + +add_acl_start(Host, Access, Group, Server) -> + %% retrieve the list of users on that host + Users_unsorted = ejabberd_auth:get_vh_registered_users(Host), + Users = lists:sort([{U, S} || {U, S} <- Users_unsorted]), + %% for each one + F = fun(User, D) -> + check_acl_and_add(User, D), + D + end, + lists:foldl(F, {Access, Group, Server}, Users). +add_acl(_Items, {U, S}) -> + D = gen_mod:get_module_opt(S, ?MODULE, add_acl, false), + check_acl_and_add({U, S}, D), + []. + + %%--------------------- %% Web Admin %%---------------------