diff options
author | Badlop <badlop@process-one.net> | 2009-01-20 20:34:58 +0300 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2009-01-20 20:34:58 +0300 |
commit | 2e511c78af8b8ba6c0ce7ccedc1c90eb83c422a9 (patch) | |
tree | d9d593b1716e6ebf462a246a2db5d61e0ee1d0f9 /src/mod_privacy.erl | |
parent | 978effade42e6602add3d2198b35b55f3dc5541d (diff) |
* src/mod_privacy.erl: Only run roster_get_jid_info if privacy
list has subscription or group (thanks to George Hazan)(EJAB-851).
Sort items in privacy list by order before storing (EJAB-848)
* src/mod_privacy.hrl: Likewise
* src/mod_privacy_odbc.erl: Likewise
SVN Revision: 1834
Diffstat (limited to 'src/mod_privacy.erl')
-rw-r--r-- | src/mod_privacy.erl | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 5fd604511..1fa1bbeaa 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -322,7 +322,8 @@ process_active_set(LUser, LServer, {value, Name}) -> [#privacy{lists = Lists}] -> case lists:keysearch(Name, 1, Lists) of {value, {_, List}} -> - {result, [], #userlist{name = Name, list = List}}; + NeedDb = is_list_needdb(List), + {result, [], #userlist{name = Name, list = List, needdb = NeedDb}}; false -> {error, ?ERR_ITEM_NOT_FOUND} end @@ -415,11 +416,7 @@ parse_items(Els) -> parse_items([], Res) -> %% Sort the items by their 'order' attribute - %% 5 is the position of 'order' attribute in a #listitem tuple - %% This integer can be calculated at runtime with: - %% 2 + length(lists:takewhile(fun(E) -> E =/= order end, - %% record_info(fields, listitem))), - lists:keysort(5, Res); + lists:keysort(#listitem.order, Res); parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) -> Type = xml:get_attr("type", Attrs), Value = xml:get_attr("value", Attrs), @@ -524,6 +521,16 @@ parse_matches1(_Item, [{xmlelement, _, _, _} | _Els]) -> +is_list_needdb(Items) -> + lists:any( + fun(X) -> + case X#listitem.type of + subscription -> true; + group -> true; + _ -> false + end + end, Items). + get_user_list(_, User, Server) -> LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), @@ -537,8 +544,8 @@ get_user_list(_, User, Server) -> _ -> case lists:keysearch(Default, 1, Lists) of {value, {_, List}} -> - SortedList = lists:keysort(#listitem.order, List), - #userlist{name = Default, list = SortedList}; + NeedDb = is_list_needdb(List), + #userlist{name = Default, list = List, needdb = NeedDb}; _ -> #userlist{} end @@ -549,7 +556,7 @@ get_user_list(_, User, Server) -> check_packet(_, User, Server, - #userlist{list = List}, + #userlist{list = List, needdb = NeedDb}, {From, To, {xmlelement, PName, _, _}}, Dir) -> case List of @@ -565,33 +572,37 @@ check_packet(_, User, Server, {message, in} -> LJID = jlib:jid_tolower(From), {Subscription, Groups} = - ejabberd_hooks:run_fold( - roster_get_jid_info, jlib:nameprep(Server), - {none, []}, [User, Server, LJID]), + case NeedDb of + true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]); + false -> {[], []} + end, check_packet_aux(List, message, LJID, Subscription, Groups); {iq, in} -> LJID = jlib:jid_tolower(From), {Subscription, Groups} = - ejabberd_hooks:run_fold( - roster_get_jid_info, jlib:nameprep(Server), - {none, []}, [User, Server, LJID]), + case NeedDb of + true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]); + false -> {[], []} + end, check_packet_aux(List, iq, LJID, Subscription, Groups); {presence, in} -> LJID = jlib:jid_tolower(From), {Subscription, Groups} = - ejabberd_hooks:run_fold( - roster_get_jid_info, jlib:nameprep(Server), - {none, []}, [User, Server, LJID]), + case NeedDb of + true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]); + false -> {[], []} + end, check_packet_aux(List, presence_in, LJID, Subscription, Groups); {presence, out} -> LJID = jlib:jid_tolower(To), {Subscription, Groups} = - ejabberd_hooks:run_fold( - roster_get_jid_info, jlib:nameprep(Server), - {none, []}, [User, Server, LJID]), + case NeedDb of + true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]); + false -> {[], []} + end, check_packet_aux(List, presence_out, LJID, Subscription, Groups); _ -> |