diff options
Diffstat (limited to 'src/mod_blocking.erl')
-rw-r--r-- | src/mod_blocking.erl | 671 |
1 files changed, 315 insertions, 356 deletions
diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl index db5fcdb4..5d5f33e9 100644 --- a/src/mod_blocking.erl +++ b/src/mod_blocking.erl @@ -28,32 +28,34 @@ -behaviour(gen_mod). --export([start/2, stop/1, - process_iq/3, - process_iq_set/4, - process_iq_get/5]). +-export([start/2, stop/1, process_iq/3, + process_iq_set/4, process_iq_get/5]). -include("ejabberd.hrl"). + -include("jlib.hrl"). + -include("mod_privacy.hrl"). start(Host, Opts) -> - IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), - ejabberd_hooks:add(privacy_iq_get, Host, - ?MODULE, process_iq_get, 40), - ejabberd_hooks:add(privacy_iq_set, Host, - ?MODULE, process_iq_set, 40), + IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1, + one_queue), + ejabberd_hooks:add(privacy_iq_get, Host, ?MODULE, + process_iq_get, 40), + ejabberd_hooks:add(privacy_iq_set, Host, ?MODULE, + process_iq_set, 40), mod_disco:register_feature(Host, ?NS_BLOCKING), - gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_BLOCKING, - ?MODULE, process_iq, IQDisc). + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, + ?NS_BLOCKING, ?MODULE, process_iq, IQDisc). stop(Host) -> - ejabberd_hooks:delete(privacy_iq_get, Host, - ?MODULE, process_iq_get, 40), - ejabberd_hooks:delete(privacy_iq_set, Host, - ?MODULE, process_iq_set, 40), + ejabberd_hooks:delete(privacy_iq_get, Host, ?MODULE, + process_iq_get, 40), + ejabberd_hooks:delete(privacy_iq_set, Host, ?MODULE, + process_iq_set, 40), mod_disco:unregister_feature(Host, ?NS_BLOCKING), - gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_BLOCKING). + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, + ?NS_BLOCKING). process_iq(_From, _To, IQ) -> SubEl = IQ#iq.sub_el, @@ -61,138 +63,118 @@ process_iq(_From, _To, IQ) -> process_iq_get(_, From, _To, #iq{xmlns = ?NS_BLOCKING, - sub_el = {xmlelement, "blocklist", _, _}}, + sub_el = #xmlel{name = <<"blocklist">>}}, _) -> #jid{luser = LUser, lserver = LServer} = From, {stop, process_blocklist_get(LUser, LServer)}; +process_iq_get(Acc, _, _, _, _) -> Acc. -process_iq_get(Acc, _, _, _, _) -> - Acc. - -process_iq_set(_, From, _To, #iq{xmlns = ?NS_BLOCKING, - sub_el = {xmlelement, SubElName, _, SubEls}}) -> +process_iq_set(_, From, _To, + #iq{xmlns = ?NS_BLOCKING, + sub_el = + #xmlel{name = SubElName, children = SubEls}}) -> #jid{luser = LUser, lserver = LServer} = From, - Res = - case {SubElName, xml:remove_cdata(SubEls)} of - {"block", []} -> - {error, ?ERR_BAD_REQUEST}; - {"block", Els} -> - JIDs = parse_blocklist_items(Els, []), - process_blocklist_block(LUser, LServer, JIDs); - {"unblock", []} -> - process_blocklist_unblock_all(LUser, LServer); - {"unblock", Els} -> - JIDs = parse_blocklist_items(Els, []), - process_blocklist_unblock(LUser, LServer, JIDs); - _ -> - {error, ?ERR_BAD_REQUEST} - end, + Res = case {SubElName, xml:remove_cdata(SubEls)} of + {<<"block">>, []} -> {error, ?ERR_BAD_REQUEST}; + {<<"block">>, Els} -> + JIDs = parse_blocklist_items(Els, []), + process_blocklist_block(LUser, LServer, JIDs); + {<<"unblock">>, []} -> + process_blocklist_unblock_all(LUser, LServer); + {<<"unblock">>, Els} -> + JIDs = parse_blocklist_items(Els, []), + process_blocklist_unblock(LUser, LServer, JIDs); + _ -> {error, ?ERR_BAD_REQUEST} + end, {stop, Res}; +process_iq_set(Acc, _, _, _) -> Acc. -process_iq_set(Acc, _, _, _) -> - Acc. - -list_to_blocklist_jids([], JIDs) -> - JIDs; - +list_to_blocklist_jids([], JIDs) -> JIDs; list_to_blocklist_jids([#listitem{type = jid, - action = deny, - value = JID} = Item | Items], JIDs) -> + action = deny, value = JID} = + Item + | Items], + JIDs) -> case Item of - #listitem{match_all = true} -> - Match = true; - #listitem{match_iq = true, - match_message = true, - match_presence_in = true, - match_presence_out = true} -> - Match = true; - _ -> - Match = false + #listitem{match_all = true} -> Match = true; + #listitem{match_iq = true, match_message = true, + match_presence_in = true, match_presence_out = true} -> + Match = true; + _ -> Match = false end, - if - Match -> - list_to_blocklist_jids(Items, [JID | JIDs]); - true -> - list_to_blocklist_jids(Items, JIDs) + if Match -> list_to_blocklist_jids(Items, [JID | JIDs]); + true -> list_to_blocklist_jids(Items, JIDs) end; - % Skip Privacy List items than cannot be mapped to Blocking items list_to_blocklist_jids([_ | Items], JIDs) -> list_to_blocklist_jids(Items, JIDs). -parse_blocklist_items([], JIDs) -> - JIDs; - -parse_blocklist_items([{xmlelement, "item", Attrs, _} | Els], JIDs) -> - case xml:get_attr("jid", Attrs) of - {value, JID1} -> - JID = jlib:jid_tolower(jlib:string_to_jid(JID1)), - parse_blocklist_items(Els, [JID | JIDs]); - false -> - % Tolerate missing jid attribute - parse_blocklist_items(Els, JIDs) +parse_blocklist_items([], JIDs) -> JIDs; +parse_blocklist_items([#xmlel{name = <<"item">>, + attrs = Attrs} + | Els], + JIDs) -> + case xml:get_attr(<<"jid">>, Attrs) of + {value, JID1} -> + JID = jlib:jid_tolower(jlib:string_to_jid(JID1)), + parse_blocklist_items(Els, [JID | JIDs]); + false -> parse_blocklist_items(Els, JIDs) end; - parse_blocklist_items([_ | Els], JIDs) -> - % Tolerate unknown elements parse_blocklist_items(Els, JIDs). process_blocklist_block(LUser, LServer, JIDs) -> - Filter = fun(List) -> - AlreadyBlocked = list_to_blocklist_jids(List, []), - lists:foldr( - fun(JID, List1) -> - case lists:member(JID, AlreadyBlocked) of - true -> - List1; - false -> - [#listitem{type = jid, - value = JID, - action = deny, - order = 0, - match_all = true} - | List1] - end - end, List, JIDs) - end, + Filter = fun (List) -> + AlreadyBlocked = list_to_blocklist_jids(List, []), + lists:foldr(fun (JID, List1) -> + case lists:member(JID, AlreadyBlocked) + of + true -> List1; + false -> + [#listitem{type = jid, + value = JID, + action = deny, + order = 0, + match_all = true} + | List1] + end + end, + List, JIDs) + end, case process_blocklist_block(LUser, LServer, Filter, - gen_mod:db_type(LServer, mod_privacy)) of - {atomic, {ok, Default, List}} -> - UserList = make_userlist(Default, List), - broadcast_list_update(LUser, LServer, Default, UserList), - broadcast_blocklist_event(LUser, LServer, {block, JIDs}), - {result, [], UserList}; - _ -> - {error, ?ERR_INTERNAL_SERVER_ERROR} + gen_mod:db_type(LServer, mod_privacy)) + of + {atomic, {ok, Default, List}} -> + UserList = make_userlist(Default, List), + broadcast_list_update(LUser, LServer, Default, + UserList), + broadcast_blocklist_event(LUser, LServer, + {block, JIDs}), + {result, [], UserList}; + _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end. -process_blocklist_block(LUser, LServer, Filter, mnesia) -> - F = - fun() -> +process_blocklist_block(LUser, LServer, Filter, + mnesia) -> + F = fun () -> case mnesia:wread({privacy, {LUser, LServer}}) of - [] -> - % No lists yet - P = #privacy{us = {LUser, LServer}}, - % TODO: i18n here: - NewDefault = "Blocked contacts", - NewLists1 = [], - List = []; - [#privacy{default = Default, - lists = Lists} = P] -> - case lists:keysearch(Default, 1, Lists) of - {value, {_, List}} -> - % Default list exists - NewDefault = Default, - NewLists1 = lists:keydelete(Default, 1, Lists); - false -> - % No default list yet, create one - % TODO: i18n here: - NewDefault = "Blocked contacts", - NewLists1 = Lists, - List = [] - end + [] -> + P = #privacy{us = {LUser, LServer}}, + NewDefault = <<"Blocked contacts">>, + NewLists1 = [], + List = []; + [#privacy{default = Default, lists = Lists} = P] -> + case lists:keysearch(Default, 1, Lists) of + {value, {_, List}} -> + NewDefault = Default, + NewLists1 = lists:keydelete(Default, 1, Lists); + false -> + NewDefault = <<"Blocked contacts">>, + NewLists1 = Lists, + List = [] + end end, - NewList = Filter(List), + NewList = Filter(List), NewLists = [{NewDefault, NewList} | NewLists1], mnesia:write(P#privacy{default = NewDefault, lists = NewLists}), @@ -200,205 +182,183 @@ process_blocklist_block(LUser, LServer, Filter, mnesia) -> end, mnesia:transaction(F); process_blocklist_block(LUser, LServer, Filter, odbc) -> - F = fun() -> - Default = - case mod_privacy:sql_get_default_privacy_list_t(LUser) of - {selected, ["name"], []} -> - Name = "Blocked contacts", - mod_privacy:sql_add_privacy_list(LUser, Name), - mod_privacy:sql_set_default_privacy_list( - LUser, Name), - Name; - {selected, ["name"], [{Name}]} -> - Name - end, - {selected, ["id"], [{ID}]} = - mod_privacy:sql_get_privacy_list_id_t(LUser, Default), - case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) of - {selected, - ["t", "value", "action", "ord", - "match_all", "match_iq", "match_message", - "match_presence_in", - "match_presence_out"], - RItems = [_|_]} -> - List = lists:map( - fun mod_privacy:raw_to_item/1, - RItems); - _ -> - List = [] - end, - NewList = Filter(List), - NewRItems = lists:map( - fun mod_privacy:item_to_raw/1, - NewList), - mod_privacy:sql_set_privacy_list( - ID, NewRItems), - {ok, Default, NewList} - end, + F = fun () -> + Default = case + mod_privacy:sql_get_default_privacy_list_t(LUser) + of + {selected, [<<"name">>], []} -> + Name = <<"Blocked contacts">>, + mod_privacy:sql_add_privacy_list(LUser, Name), + mod_privacy:sql_set_default_privacy_list(LUser, + Name), + Name; + {selected, [<<"name">>], [[Name]]} -> Name + end, + {selected, [<<"id">>], [[ID]]} = + mod_privacy:sql_get_privacy_list_id_t(LUser, Default), + case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) + of + {selected, + [<<"t">>, <<"value">>, <<"action">>, <<"ord">>, + <<"match_all">>, <<"match_iq">>, <<"match_message">>, + <<"match_presence_in">>, <<"match_presence_out">>], + RItems = [_ | _]} -> + List = lists:map(fun mod_privacy:raw_to_item/1, RItems); + _ -> List = [] + end, + NewList = Filter(List), + NewRItems = lists:map(fun mod_privacy:item_to_raw/1, + NewList), + mod_privacy:sql_set_privacy_list(ID, NewRItems), + {ok, Default, NewList} + end, ejabberd_odbc:sql_transaction(LServer, F). process_blocklist_unblock_all(LUser, LServer) -> - Filter = fun(List) -> - lists:filter( - fun(#listitem{action = A}) -> - A =/= deny - end, List) - end, - case process_blocklist_unblock_all( - LUser, LServer, Filter, gen_mod:db_type(LServer, mod_privacy)) of - {atomic, ok} -> - {result, []}; - {atomic, {ok, Default, List}} -> - UserList = make_userlist(Default, List), - broadcast_list_update(LUser, LServer, Default, UserList), - broadcast_blocklist_event(LUser, LServer, unblock_all), - {result, [], UserList}; - _ -> - {error, ?ERR_INTERNAL_SERVER_ERROR} + Filter = fun (List) -> + lists:filter(fun (#listitem{action = A}) -> A =/= deny + end, + List) + end, + case process_blocklist_unblock_all(LUser, LServer, + Filter, + gen_mod:db_type(LServer, mod_privacy)) + of + {atomic, ok} -> {result, []}; + {atomic, {ok, Default, List}} -> + UserList = make_userlist(Default, List), + broadcast_list_update(LUser, LServer, Default, + UserList), + broadcast_blocklist_event(LUser, LServer, unblock_all), + {result, [], UserList}; + _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end. -process_blocklist_unblock_all(LUser, LServer, Filter, mnesia) -> - F = - fun() -> +process_blocklist_unblock_all(LUser, LServer, Filter, + mnesia) -> + F = fun () -> case mnesia:read({privacy, {LUser, LServer}}) of - [] -> - % No lists, nothing to unblock - ok; - [#privacy{default = Default, - lists = Lists} = P] -> - case lists:keysearch(Default, 1, Lists) of - {value, {_, List}} -> - % Default list, remove all deny items - NewList = Filter(List), - NewLists1 = lists:keydelete(Default, 1, Lists), - NewLists = [{Default, NewList} | NewLists1], - mnesia:write(P#privacy{lists = NewLists}), - - {ok, Default, NewList}; - false -> - % No default list, nothing to unblock - ok - end + [] -> + % No lists, nothing to unblock + ok; + [#privacy{default = Default, lists = Lists} = P] -> + case lists:keysearch(Default, 1, Lists) of + {value, {_, List}} -> + NewList = Filter(List), + NewLists1 = lists:keydelete(Default, 1, Lists), + NewLists = [{Default, NewList} | NewLists1], + mnesia:write(P#privacy{lists = NewLists}), + {ok, Default, NewList}; + false -> + % No default list, nothing to unblock + ok + end end end, mnesia:transaction(F); -process_blocklist_unblock_all(LUser, LServer, Filter, odbc) -> - F = fun() -> - case mod_privacy:sql_get_default_privacy_list_t(LUser) of - {selected, ["name"], []} -> - ok; - {selected, ["name"], [{Default}]} -> - {selected, ["id"], [{ID}]} = - mod_privacy:sql_get_privacy_list_id_t( - LUser, Default), - case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) of - {selected, - ["t", "value", "action", "ord", - "match_all", "match_iq", "match_message", - "match_presence_in", - "match_presence_out"], - RItems = [_|_]} -> - List = lists:map( - fun mod_privacy:raw_to_item/1, - RItems), - NewList = Filter(List), - NewRItems = lists:map( - fun mod_privacy:item_to_raw/1, - NewList), - mod_privacy:sql_set_privacy_list( - ID, NewRItems), - {ok, Default, NewList}; - _ -> - ok - end; - _ -> - ok - end - end, +process_blocklist_unblock_all(LUser, LServer, Filter, + odbc) -> + F = fun () -> + case mod_privacy:sql_get_default_privacy_list_t(LUser) + of + {selected, [<<"name">>], []} -> ok; + {selected, [<<"name">>], [[Default]]} -> + {selected, [<<"id">>], [[ID]]} = + mod_privacy:sql_get_privacy_list_id_t(LUser, Default), + case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) + of + {selected, + [<<"t">>, <<"value">>, <<"action">>, <<"ord">>, + <<"match_all">>, <<"match_iq">>, <<"match_message">>, + <<"match_presence_in">>, <<"match_presence_out">>], + RItems = [_ | _]} -> + List = lists:map(fun mod_privacy:raw_to_item/1, + RItems), + NewList = Filter(List), + NewRItems = lists:map(fun mod_privacy:item_to_raw/1, + NewList), + mod_privacy:sql_set_privacy_list(ID, NewRItems), + {ok, Default, NewList}; + _ -> ok + end; + _ -> ok + end + end, ejabberd_odbc:sql_transaction(LServer, F). process_blocklist_unblock(LUser, LServer, JIDs) -> - Filter = fun(List) -> - lists:filter( - fun(#listitem{action = deny, - type = jid, - value = JID}) -> - not(lists:member(JID, JIDs)); - (_) -> - true - end, List) - end, + Filter = fun (List) -> + lists:filter(fun (#listitem{action = deny, type = jid, + value = JID}) -> + not lists:member(JID, JIDs); + (_) -> true + end, + List) + end, case process_blocklist_unblock(LUser, LServer, Filter, - gen_mod:db_type(LServer, mod_privacy)) of - {atomic, ok} -> - {result, []}; - {atomic, {ok, Default, List}} -> - UserList = make_userlist(Default, List), - broadcast_list_update(LUser, LServer, Default, UserList), - broadcast_blocklist_event(LUser, LServer, {unblock, JIDs}), - {result, [], UserList}; - _ -> - {error, ?ERR_INTERNAL_SERVER_ERROR} + gen_mod:db_type(LServer, mod_privacy)) + of + {atomic, ok} -> {result, []}; + {atomic, {ok, Default, List}} -> + UserList = make_userlist(Default, List), + broadcast_list_update(LUser, LServer, Default, + UserList), + broadcast_blocklist_event(LUser, LServer, + {unblock, JIDs}), + {result, [], UserList}; + _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end. -process_blocklist_unblock(LUser, LServer, Filter, mnesia) -> - F = - fun() -> +process_blocklist_unblock(LUser, LServer, Filter, + mnesia) -> + F = fun () -> case mnesia:read({privacy, {LUser, LServer}}) of - [] -> - % No lists, nothing to unblock - ok; - [#privacy{default = Default, - lists = Lists} = P] -> - case lists:keysearch(Default, 1, Lists) of - {value, {_, List}} -> - % Default list, remove matching deny items - NewList = Filter(List), - NewLists1 = lists:keydelete(Default, 1, Lists), - NewLists = [{Default, NewList} | NewLists1], - mnesia:write(P#privacy{lists = NewLists}), - - {ok, Default, NewList}; - false -> - % No default list, nothing to unblock - ok - end + [] -> + % No lists, nothing to unblock + ok; + [#privacy{default = Default, lists = Lists} = P] -> + case lists:keysearch(Default, 1, Lists) of + {value, {_, List}} -> + NewList = Filter(List), + NewLists1 = lists:keydelete(Default, 1, Lists), + NewLists = [{Default, NewList} | NewLists1], + mnesia:write(P#privacy{lists = NewLists}), + {ok, Default, NewList}; + false -> + % No default list, nothing to unblock + ok + end end end, mnesia:transaction(F); -process_blocklist_unblock(LUser, LServer, Filter, odbc) -> - F = fun() -> - case mod_privacy:sql_get_default_privacy_list_t(LUser) of - {selected, ["name"], []} -> - ok; - {selected, ["name"], [{Default}]} -> - {selected, ["id"], [{ID}]} = - mod_privacy:sql_get_privacy_list_id_t( - LUser, Default), - case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) of - {selected, - ["t", "value", "action", "ord", - "match_all", "match_iq", "match_message", - "match_presence_in", - "match_presence_out"], - RItems = [_|_]} -> - List = lists:map( - fun mod_privacy:raw_to_item/1, - RItems), - NewList = Filter(List), - NewRItems = lists:map( - fun mod_privacy:item_to_raw/1, - NewList), - mod_privacy:sql_set_privacy_list( - ID, NewRItems), - {ok, Default, NewList}; - _ -> - ok - end; - _ -> - ok - end - end, +process_blocklist_unblock(LUser, LServer, Filter, + odbc) -> + F = fun () -> + case mod_privacy:sql_get_default_privacy_list_t(LUser) + of + {selected, [<<"name">>], []} -> ok; + {selected, [<<"name">>], [[Default]]} -> + {selected, [<<"id">>], [[ID]]} = + mod_privacy:sql_get_privacy_list_id_t(LUser, Default), + case mod_privacy:sql_get_privacy_list_data_by_id_t(ID) + of + {selected, + [<<"t">>, <<"value">>, <<"action">>, <<"ord">>, + <<"match_all">>, <<"match_iq">>, <<"match_message">>, + <<"match_presence_in">>, <<"match_presence_out">>], + RItems = [_ | _]} -> + List = lists:map(fun mod_privacy:raw_to_item/1, + RItems), + NewList = Filter(List), + NewRItems = lists:map(fun mod_privacy:item_to_raw/1, + NewList), + mod_privacy:sql_set_privacy_list(ID, NewRItems), + {ok, Default, NewList}; + _ -> ok + end; + _ -> ok + end + end, ejabberd_odbc:sql_transaction(LServer, F). make_userlist(Name, List) -> @@ -406,66 +366,65 @@ make_userlist(Name, List) -> #userlist{name = Name, list = List, needdb = NeedDb}. broadcast_list_update(LUser, LServer, Name, UserList) -> - ejabberd_router:route( - jlib:make_jid(LUser, LServer, ""), - jlib:make_jid(LUser, LServer, ""), - {xmlelement, "broadcast", [], - [{privacy_list, UserList, Name}]}). + ejabberd_sm:route(jlib:make_jid(LUser, LServer, + <<"">>), + jlib:make_jid(LUser, LServer, <<"">>), + {broadcast, {privacy_list, UserList, Name}}). broadcast_blocklist_event(LUser, LServer, Event) -> - JID = jlib:make_jid(LUser, LServer, ""), - ejabberd_router:route( - JID, JID, - {xmlelement, "broadcast", [], - [{blocking, Event}]}). + JID = jlib:make_jid(LUser, LServer, <<"">>), + ejabberd_sm:route(JID, JID, + {broadcast, {blocking, Event}}). process_blocklist_get(LUser, LServer) -> - case process_blocklist_get( - LUser, LServer, gen_mod:db_type(LServer, mod_privacy)) of - error -> - {error, ?ERR_INTERNAL_SERVER_ERROR}; - List -> - JIDs = list_to_blocklist_jids(List, []), - Items = lists:map( - fun(JID) -> - ?DEBUG("JID: ~p",[JID]), - {xmlelement, "item", - [{"jid", jlib:jid_to_string(JID)}], []} - end, JIDs), - {result, - [{xmlelement, "blocklist", [{"xmlns", ?NS_BLOCKING}], - Items}]} + case process_blocklist_get(LUser, LServer, + gen_mod:db_type(LServer, mod_privacy)) + of + error -> {error, ?ERR_INTERNAL_SERVER_ERROR}; + List -> + JIDs = list_to_blocklist_jids(List, []), + Items = lists:map(fun (JID) -> + ?DEBUG("JID: ~p", [JID]), + #xmlel{name = <<"item">>, + attrs = + [{<<"jid">>, + jlib:jid_to_string(JID)}], + children = []} + end, + JIDs), + {result, + [#xmlel{name = <<"blocklist">>, + attrs = [{<<"xmlns">>, ?NS_BLOCKING}], + children = Items}]} end. process_blocklist_get(LUser, LServer, mnesia) -> - case catch mnesia:dirty_read(privacy, {LUser, LServer}) of - {'EXIT', _Reason} -> - error; - [] -> - []; - [#privacy{default = Default, lists = Lists}] -> - case lists:keysearch(Default, 1, Lists) of - {value, {_, List}} -> - List; - _ -> - [] - end + case catch mnesia:dirty_read(privacy, {LUser, LServer}) + of + {'EXIT', _Reason} -> error; + [] -> []; + [#privacy{default = Default, lists = Lists}] -> + case lists:keysearch(Default, 1, Lists) of + {value, {_, List}} -> List; + _ -> [] + end end; process_blocklist_get(LUser, LServer, odbc) -> - case catch mod_privacy:sql_get_default_privacy_list(LUser, LServer) of - {selected, ["name"], []} -> - []; - {selected, ["name"], [{Default}]} -> - case catch mod_privacy:sql_get_privacy_list_data( - LUser, LServer, Default) of - {selected, ["t", "value", "action", "ord", "match_all", - "match_iq", "match_message", - "match_presence_in", "match_presence_out"], - RItems} -> - lists:map(fun mod_privacy:raw_to_item/1, RItems); - {'EXIT', _} -> - error - end; - {'EXIT', _} -> - error + case catch + mod_privacy:sql_get_default_privacy_list(LUser, LServer) + of + {selected, [<<"name">>], []} -> []; + {selected, [<<"name">>], [[Default]]} -> + case catch mod_privacy:sql_get_privacy_list_data(LUser, + LServer, Default) + of + {selected, + [<<"t">>, <<"value">>, <<"action">>, <<"ord">>, + <<"match_all">>, <<"match_iq">>, <<"match_message">>, + <<"match_presence_in">>, <<"match_presence_out">>], + RItems} -> + lists:map(fun mod_privacy:raw_to_item/1, RItems); + {'EXIT', _} -> error + end; + {'EXIT', _} -> error end. |