aboutsummaryrefslogtreecommitdiff
path: root/src/mod_privacy_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_privacy_sql.erl')
-rw-r--r--src/mod_privacy_sql.erl302
1 files changed, 142 insertions, 160 deletions
diff --git a/src/mod_privacy_sql.erl b/src/mod_privacy_sql.erl
index 615ef7a0d..45c86e12c 100644
--- a/src/mod_privacy_sql.erl
+++ b/src/mod_privacy_sql.erl
@@ -29,20 +29,11 @@
-behaviour(mod_privacy).
%% API
--export([init/2, process_lists_get/2, process_list_get/3,
- process_default_set/3, process_active_set/3,
- remove_privacy_list/3, set_privacy_list/1,
- set_privacy_list/4, get_user_list/2, get_user_lists/2,
- remove_user/2, import/1, export/1]).
-
--export([item_to_raw/1, raw_to_item/1,
- sql_add_privacy_list/2,
- sql_get_default_privacy_list/2,
- sql_get_default_privacy_list_t/1,
- sql_get_privacy_list_data/3,
- sql_get_privacy_list_data_by_id_t/1,
- sql_get_privacy_list_id_t/2,
- sql_set_default_privacy_list/2, sql_set_privacy_list/2]).
+-export([init/2, set_default/3, unset_default/2, set_lists/1,
+ set_list/4, get_lists/2, get_list/3, remove_lists/2,
+ remove_list/3, import/1, export/1]).
+
+-export([item_to_raw/1, raw_to_item/1]).
-include("xmpp.hrl").
-include("mod_privacy.hrl").
@@ -55,159 +46,143 @@
init(_Host, _Opts) ->
ok.
-process_lists_get(LUser, LServer) ->
- Default = case catch sql_get_default_privacy_list(LUser, LServer) of
- {selected, []} -> none;
- {selected, [{DefName}]} -> DefName;
- _ -> none
- end,
- case catch sql_get_privacy_list_names(LUser, LServer) of
- {selected, Names} ->
- LItems = lists:map(fun ({N}) -> N end, Names),
- {Default, LItems};
- _ -> error
+unset_default(LUser, LServer) ->
+ case unset_default_privacy_list(LUser, LServer) of
+ ok ->
+ ok;
+ _Err ->
+ {error, db_failure}
end.
-process_list_get(LUser, LServer, Name) ->
- case catch sql_get_privacy_list_id(LUser, LServer, Name) of
- {selected, []} -> not_found;
- {selected, [{ID}]} ->
- case catch sql_get_privacy_list_data_by_id(ID, LServer) of
- {selected, RItems} ->
- lists:flatmap(fun raw_to_item/1, RItems);
- _ -> error
- end;
- _ -> error
- end.
-
-process_default_set(LUser, LServer, none) ->
- case catch sql_unset_default_privacy_list(LUser,
- LServer)
- of
- {'EXIT', _Reason} -> {atomic, error};
- {error, _Reason} -> {atomic, error};
- _ -> {atomic, ok}
- end;
-process_default_set(LUser, LServer, Name) ->
+set_default(LUser, LServer, Name) ->
F = fun () ->
- case sql_get_privacy_list_names_t(LUser) of
- {selected, []} -> not_found;
- {selected, Names} ->
- case lists:member({Name}, Names) of
- true -> sql_set_default_privacy_list(LUser, Name), ok;
- false -> not_found
- end
+ case get_privacy_list_names_t(LUser) of
+ {selected, []} ->
+ {error, notfound};
+ {selected, Names} ->
+ case lists:member({Name}, Names) of
+ true ->
+ set_default_privacy_list(LUser, Name);
+ false ->
+ {error, notfound}
+ end
end
end,
- sql_queries:sql_transaction(LServer, F).
-
-process_active_set(LUser, LServer, Name) ->
- case catch sql_get_privacy_list_id(LUser, LServer, Name) of
- {selected, []} -> error;
- {selected, [{ID}]} ->
- case catch sql_get_privacy_list_data_by_id(ID, LServer) of
- {selected, RItems} ->
- lists:flatmap(fun raw_to_item/1, RItems);
- _ -> error
- end;
- _ -> error
- end.
+ transaction(LServer, F).
-remove_privacy_list(LUser, LServer, Name) ->
+remove_list(LUser, LServer, Name) ->
F = fun () ->
- case sql_get_default_privacy_list_t(LUser) of
- {selected, []} ->
- sql_remove_privacy_list(LUser, Name), ok;
- {selected, [{Default}]} ->
- if Name == Default -> conflict;
- true -> sql_remove_privacy_list(LUser, Name), ok
- end
+ case get_default_privacy_list_t(LUser) of
+ {selected, []} ->
+ remove_privacy_list(LUser, Name);
+ {selected, [{Default}]} ->
+ if Name == Default ->
+ {error, conflict};
+ true ->
+ remove_privacy_list(LUser, Name)
+ end
end
end,
- sql_queries:sql_transaction(LServer, F).
+ transaction(LServer, F).
-set_privacy_list(#privacy{us = {LUser, LServer},
- default = Default,
- lists = Lists}) ->
+set_lists(#privacy{us = {LUser, LServer},
+ default = Default,
+ lists = Lists}) ->
F = fun() ->
lists:foreach(
fun({Name, List}) ->
- sql_add_privacy_list(LUser, Name),
+ add_privacy_list(LUser, Name),
{selected, [<<"id">>], [[I]]} =
- sql_get_privacy_list_id_t(LUser, Name),
+ get_privacy_list_id_t(LUser, Name),
RItems = lists:map(fun item_to_raw/1, List),
- sql_set_privacy_list(I, RItems),
+ set_privacy_list(I, RItems),
if is_binary(Default) ->
- sql_set_default_privacy_list(LUser, Default),
- ok;
+ set_default_privacy_list(LUser, Default);
true ->
ok
end
end, Lists)
end,
- sql_queries:sql_transaction(LServer, F).
+ transaction(LServer, F).
-set_privacy_list(LUser, LServer, Name, List) ->
+set_list(LUser, LServer, Name, List) ->
RItems = lists:map(fun item_to_raw/1, List),
F = fun () ->
- ID = case sql_get_privacy_list_id_t(LUser, Name) of
+ ID = case get_privacy_list_id_t(LUser, Name) of
{selected, []} ->
- sql_add_privacy_list(LUser, Name),
- {selected, [{I}]} =
- sql_get_privacy_list_id_t(LUser, Name),
- I;
- {selected, [{I}]} -> I
+ add_privacy_list(LUser, Name),
+ {selected, [{I}]} =
+ get_privacy_list_id_t(LUser, Name),
+ I;
+ {selected, [{I}]} -> I
end,
- sql_set_privacy_list(ID, RItems),
- ok
+ set_privacy_list(ID, RItems)
end,
- sql_queries:sql_transaction(LServer, F).
-
-get_user_list(LUser, LServer) ->
- case catch sql_get_default_privacy_list(LUser, LServer)
- of
- {selected, []} -> {none, []};
- {selected, [{Default}]} ->
- case catch sql_get_privacy_list_data(LUser, LServer,
- Default) of
- {selected, RItems} ->
- {Default, lists:flatmap(fun raw_to_item/1, RItems)};
- _ -> {none, []}
- end;
- _ -> {none, []}
+ transaction(LServer, F).
+
+get_list(LUser, LServer, default) ->
+ case get_default_privacy_list(LUser, LServer) of
+ {selected, []} ->
+ error;
+ {selected, [{Default}]} ->
+ get_list(LUser, LServer, Default);
+ _Err ->
+ {error, db_failure}
+ end;
+get_list(LUser, LServer, Name) ->
+ case get_privacy_list_data(LUser, LServer, Name) of
+ {selected, []} ->
+ error;
+ {selected, RItems} ->
+ {ok, {Name, lists:flatmap(fun raw_to_item/1, RItems)}};
+ _Err ->
+ {error, db_failure}
end.
-get_user_lists(LUser, LServer) ->
- Default = case catch sql_get_default_privacy_list(LUser, LServer) of
- {selected, []} ->
- none;
- {selected, [{DefName}]} ->
- DefName;
- _ ->
- none
- end,
- case catch sql_get_privacy_list_names(LUser, LServer) of
- {selected, Names} ->
- Lists =
- lists:flatmap(
- fun({Name}) ->
- case catch sql_get_privacy_list_data(
- LUser, LServer, Name) of
- {selected, RItems} ->
- [{Name, lists:flatmap(fun raw_to_item/1, RItems)}];
- _ ->
- []
- end
- end, Names),
- {ok, #privacy{default = Default,
- us = {LUser, LServer},
- lists = Lists}};
- _ ->
- error
+get_lists(LUser, LServer) ->
+ case get_default_privacy_list(LUser, LServer) of
+ {selected, Selected} ->
+ Default = case Selected of
+ [] -> none;
+ [{DefName}] -> DefName
+ end,
+ case get_privacy_list_names(LUser, LServer) of
+ {selected, Names} ->
+ case lists:foldl(
+ fun(_, {error, _} = Err) ->
+ Err;
+ ({Name}, Acc) ->
+ case get_privacy_list_data(LUser, LServer, Name) of
+ {selected, RItems} ->
+ Items = lists:flatmap(
+ fun raw_to_item/1,
+ RItems),
+ [{Name, Items}|Acc];
+ _Err ->
+ {error, db_failure}
+ end
+ end, [], Names) of
+ {error, Reason} ->
+ {error, Reason};
+ Lists ->
+ {ok, #privacy{default = Default,
+ us = {LUser, LServer},
+ lists = Lists}}
+ end;
+ _Err ->
+ {error, db_failure}
+ end;
+ _Err ->
+ {error, db_failure}
end.
-remove_user(LUser, LServer) ->
- sql_del_privacy_lists(LUser, LServer).
+remove_lists(LUser, LServer) ->
+ case del_privacy_lists(LUser, LServer) of
+ ok ->
+ ok;
+ _Err ->
+ {error, db_failure}
+ end.
export(Server) ->
case catch ejabberd_sql:sql_query(jid:nameprep(Server),
@@ -271,6 +246,12 @@ import(_) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+transaction(LServer, F) ->
+ case ejabberd_sql:sql_transaction(LServer, F) of
+ {atomic, Res} -> Res;
+ {aborted, _Reason} -> {error, db_failure}
+ end.
+
raw_to_item({SType, SValue, SAction, Order, MatchAll,
MatchIQ, MatchMessage, MatchPresenceIn,
MatchPresenceOut} = Row) ->
@@ -327,47 +308,48 @@ item_to_raw(#listitem{type = Type, value = Value,
{SType, SValue, SAction, Order, MatchAll, MatchIQ,
MatchMessage, MatchPresenceIn, MatchPresenceOut}.
-sql_get_default_privacy_list(LUser, LServer) ->
+get_default_privacy_list(LUser, LServer) ->
sql_queries:get_default_privacy_list(LServer, LUser).
-sql_get_default_privacy_list_t(LUser) ->
+get_default_privacy_list_t(LUser) ->
sql_queries:get_default_privacy_list_t(LUser).
-sql_get_privacy_list_names(LUser, LServer) ->
+get_privacy_list_names(LUser, LServer) ->
sql_queries:get_privacy_list_names(LServer, LUser).
-sql_get_privacy_list_names_t(LUser) ->
+get_privacy_list_names_t(LUser) ->
sql_queries:get_privacy_list_names_t(LUser).
-sql_get_privacy_list_id(LUser, LServer, Name) ->
- sql_queries:get_privacy_list_id(LServer, LUser, Name).
-
-sql_get_privacy_list_id_t(LUser, Name) ->
+get_privacy_list_id_t(LUser, Name) ->
sql_queries:get_privacy_list_id_t(LUser, Name).
-sql_get_privacy_list_data(LUser, LServer, Name) ->
+get_privacy_list_data(LUser, LServer, Name) ->
sql_queries:get_privacy_list_data(LServer, LUser, Name).
-sql_get_privacy_list_data_by_id(ID, LServer) ->
- sql_queries:get_privacy_list_data_by_id(LServer, ID).
-
-sql_get_privacy_list_data_by_id_t(ID) ->
- sql_queries:get_privacy_list_data_by_id_t(ID).
-
-sql_set_default_privacy_list(LUser, Name) ->
+set_default_privacy_list(LUser, Name) ->
sql_queries:set_default_privacy_list(LUser, Name).
-sql_unset_default_privacy_list(LUser, LServer) ->
- sql_queries:unset_default_privacy_list(LServer, LUser).
+unset_default_privacy_list(LUser, LServer) ->
+ case sql_queries:unset_default_privacy_list(LServer, LUser) of
+ {updated, _} -> ok;
+ Err -> Err
+ end.
-sql_remove_privacy_list(LUser, Name) ->
- sql_queries:remove_privacy_list(LUser, Name).
+remove_privacy_list(LUser, Name) ->
+ case sql_queries:remove_privacy_list(LUser, Name) of
+ {updated, 0} -> {error, notfound};
+ {updated, _} -> ok;
+ Err -> Err
+ end.
-sql_add_privacy_list(LUser, Name) ->
+add_privacy_list(LUser, Name) ->
sql_queries:add_privacy_list(LUser, Name).
-sql_set_privacy_list(ID, RItems) ->
+set_privacy_list(ID, RItems) ->
sql_queries:set_privacy_list(ID, RItems).
-sql_del_privacy_lists(LUser, LServer) ->
- sql_queries:del_privacy_lists(LServer, LUser).
+del_privacy_lists(LUser, LServer) ->
+ case sql_queries:del_privacy_lists(LServer, LUser) of
+ {updated, _} -> ok;
+ Err -> Err
+ end.