aboutsummaryrefslogtreecommitdiff
path: root/src/mod_blocking_odbc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_blocking_odbc.erl')
-rw-r--r--src/mod_blocking_odbc.erl365
1 files changed, 0 insertions, 365 deletions
diff --git a/src/mod_blocking_odbc.erl b/src/mod_blocking_odbc.erl
deleted file mode 100644
index 016e7945e..000000000
--- a/src/mod_blocking_odbc.erl
+++ /dev/null
@@ -1,365 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : mod_blocking_odbc.erl
-%%% Author : Stephan Maka
-%%% Purpose : XEP-0191: Simple Communications Blocking
-%%% Created : 24 Aug 2008 by Stephan Maka <stephan@spaceboyz.net>
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
-%%%
-%%% This program is free software; you can redistribute it and/or
-%%% modify it under the terms of the GNU General Public License as
-%%% published by the Free Software Foundation; either version 2 of the
-%%% License, or (at your option) any later version.
-%%%
-%%% This program is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-%%% General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with this program; if not, write to the Free Software
-%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-%%% 02111-1307 USA
-%%%
-%%%----------------------------------------------------------------------
-
--module(mod_blocking_odbc).
-
--behaviour(gen_mod).
-
--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),
- mod_disco:register_feature(Host, ?NS_BLOCKING),
- 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),
- mod_disco:unregister_feature(Host, ?NS_BLOCKING),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_BLOCKING).
-
-process_iq(_From, _To, IQ) ->
- SubEl = IQ#iq.sub_el,
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
-
-process_iq_get(_, From, _To,
- #iq{xmlns = ?NS_BLOCKING,
- sub_el = {xmlelement, "blocklist", _, _}},
- _) ->
- #jid{luser = LUser, lserver = LServer} = From,
- {stop, process_blocklist_get(LUser, LServer)};
-
-process_iq_get(Acc, _, _, _, _) ->
- Acc.
-
-process_iq_set(_, From, _To, #iq{xmlns = ?NS_BLOCKING,
- sub_el = {xmlelement, SubElName, _, 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,
- {stop, Res};
-
-process_iq_set(Acc, _, _, _) ->
- Acc.
-
-is_list_needdb(Items) ->
- lists:any(
- fun(X) ->
- case X#listitem.type of
- subscription -> true;
- group -> true;
- _ -> false
- end
- end, Items).
-
-list_to_blocklist_jids([], JIDs) ->
- JIDs;
-
-list_to_blocklist_jids([#listitem{type = jid,
- 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
- end,
- 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)
- end;
-
-parse_blocklist_items([_ | Els], JIDs) ->
- % Tolerate unknown elements
- parse_blocklist_items(Els, JIDs).
-
-process_blocklist_block(LUser, LServer, JIDs) ->
- F = fun() ->
- Default =
- case mod_privacy_odbc:sql_get_default_privacy_list_t(LUser) of
- {selected, ["name"], []} ->
- Name = "Blocked contacts",
- mod_privacy_odbc:sql_add_privacy_list(LUser, Name),
- mod_privacy_odbc:sql_set_default_privacy_list(
- LUser, Name),
- Name;
- {selected, ["name"], [{Name}]} ->
- Name
- end,
- {selected, ["id"], [{ID}]} =
- mod_privacy_odbc:sql_get_privacy_list_id_t(LUser, Default),
- case mod_privacy_odbc: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_odbc:raw_to_item/1,
- RItems);
- _ ->
- List = []
- end,
- AlreadyBlocked = list_to_blocklist_jids(List, []),
- NewList =
- 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),
- NewRItems = lists:map(
- fun mod_privacy_odbc:item_to_raw/1,
- NewList),
- mod_privacy_odbc:sql_set_privacy_list(
- ID, NewRItems),
- {ok, Default, NewList}
- end,
- case ejabberd_odbc:sql_transaction(LServer, F) of
- {atomic, {error, _} = Error} ->
- Error;
- {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_unblock_all(LUser, LServer) ->
- F = fun() ->
- case mod_privacy_odbc:sql_get_default_privacy_list_t(LUser) of
- {selected, ["name"], []} ->
- ok;
- {selected, ["name"], [{Default}]} ->
- {selected, ["id"], [{ID}]} =
- mod_privacy_odbc:sql_get_privacy_list_id_t(
- LUser, Default),
- case mod_privacy_odbc: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_odbc:raw_to_item/1,
- RItems),
- NewList =
- lists:filter(
- fun(#listitem{action = A}) ->
- A =/= deny
- end, List),
- NewRItems = lists:map(
- fun mod_privacy_odbc:item_to_raw/1,
- NewList),
- mod_privacy_odbc:sql_set_privacy_list(
- ID, NewRItems),
- {ok, Default, NewList};
- _ ->
- ok
- end;
- _ ->
- ok
- end
- end,
- case ejabberd_odbc:sql_transaction(LServer, F) of
- {atomic, {error, _} = Error} ->
- Error;
- {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(LUser, LServer, JIDs) ->
- F = fun() ->
- case mod_privacy_odbc:sql_get_default_privacy_list_t(LUser) of
- {selected, ["name"], []} ->
- ok;
- {selected, ["name"], [{Default}]} ->
- {selected, ["id"], [{ID}]} =
- mod_privacy_odbc:sql_get_privacy_list_id_t(
- LUser, Default),
- case mod_privacy_odbc: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_odbc:raw_to_item/1,
- RItems),
- NewList =
- lists:filter(
- fun(#listitem{action = deny,
- type = jid,
- value = JID}) ->
- not(lists:member(JID, JIDs));
- (_) ->
- true
- end, List),
- NewRItems = lists:map(
- fun mod_privacy_odbc:item_to_raw/1,
- NewList),
- mod_privacy_odbc:sql_set_privacy_list(
- ID, NewRItems),
- {ok, Default, NewList};
- _ ->
- ok
- end;
- _ ->
- ok
- end
- end,
- case ejabberd_odbc:sql_transaction(LServer, F) of
- {atomic, {error, _} = Error} ->
- Error;
- {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.
-
-make_userlist(Name, List) ->
- NeedDb = is_list_needdb(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}]}).
-
-broadcast_blocklist_event(LUser, LServer, Event) ->
- JID = jlib:make_jid(LUser, LServer, ""),
- ejabberd_router:route(
- JID, JID,
- {xmlelement, "broadcast", [],
- [{blocking, Event}]}).
-
-process_blocklist_get(LUser, LServer) ->
- case catch mod_privacy_odbc:sql_get_default_privacy_list(LUser, LServer) of
- {selected, ["name"], []} ->
- {result, [{xmlelement, "blocklist",
- [{"xmlns", ?NS_BLOCKING}], []}]};
- {selected, ["name"], [{Default}]} ->
- case catch mod_privacy_odbc: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} ->
- List = lists:map(fun mod_privacy_odbc:raw_to_item/1, RItems),
- 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}]};
- {'EXIT', _} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end;
- {'EXIT', _} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end.