1 |
|
%%%---------------------------------------------------------------------- |
2 |
|
%%% Copyright notice from original mod_privacy |
3 |
|
%%% |
4 |
|
%%% File : mod_privacy.erl |
5 |
|
%%% Author : Alexey Shchepin <alexey@process-one.net> |
6 |
|
%%% Purpose : jabber:iq:privacy support |
7 |
|
%%% Created : 21 Jul 2003 by Alexey Shchepin <alexey@process-one.net> |
8 |
|
%%% |
9 |
|
%%% |
10 |
|
%%% ejabberd, Copyright (C) 2002-2011 ProcessOne |
11 |
|
%%% |
12 |
|
%%% This program is free software; you can redistribute it and/or |
13 |
|
%%% modify it under the terms of the GNU General Public License as |
14 |
|
%%% published by the Free Software Foundation; either version 2 of the |
15 |
|
%%% License, or (at your option) any later version. |
16 |
|
%%% |
17 |
|
%%% This program is distributed in the hope that it will be useful, |
18 |
|
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 |
|
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
20 |
|
%%% General Public License for more details. |
21 |
|
%%% |
22 |
|
%%% You should have received a copy of the GNU General Public License |
23 |
|
%%% along with this program; if not, write to the Free Software |
24 |
|
%%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
25 |
|
%%% |
26 |
|
%%%---------------------------------------------------------------------- |
27 |
|
|
28 |
|
-module(mod_privacy_mnesia). |
29 |
|
-author('alexey@process-one.net'). |
30 |
|
-author('arcusfelis@gmail.com'). |
31 |
|
-behaviour(mod_privacy_backend). |
32 |
|
|
33 |
|
-export([init/2, |
34 |
|
get_default_list/3, |
35 |
|
get_list_names/3, |
36 |
|
get_privacy_list/4, |
37 |
|
set_default_list/4, |
38 |
|
forget_default_list/3, |
39 |
|
remove_privacy_list/4, |
40 |
|
replace_privacy_list/5, |
41 |
|
remove_user/3, |
42 |
|
remove_domain/2]). |
43 |
|
|
44 |
|
-include("mongoose.hrl"). |
45 |
|
-include("jlib.hrl"). |
46 |
|
-include("mod_privacy.hrl"). |
47 |
|
|
48 |
|
init(_HostType, _Opts) -> |
49 |
4 |
mongoose_mnesia:create_table(privacy, |
50 |
|
[{disc_copies, [node()]}, |
51 |
|
{attributes, record_info(fields, privacy)}]), |
52 |
4 |
ok. |
53 |
|
|
54 |
|
get_default_list(_HostType, LUser, LServer) -> |
55 |
2523 |
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of |
56 |
|
[] -> |
57 |
2395 |
{error, not_found}; |
58 |
|
[#privacy{default = Default, lists = Lists}] -> |
59 |
128 |
case lists:keysearch(Default, 1, Lists) of |
60 |
|
{value, {_, List}} -> |
61 |
70 |
{ok, {Default, List}}; |
62 |
|
_ -> |
63 |
58 |
{error, not_found} |
64 |
|
end; |
65 |
|
{'EXIT', Reason} -> |
66 |
:-( |
{error, Reason} |
67 |
|
end. |
68 |
|
|
69 |
|
get_list_names(_HostType, LUser, LServer) -> |
70 |
3 |
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of |
71 |
|
{'EXIT', Reason} -> |
72 |
:-( |
{error, Reason}; |
73 |
|
[] -> |
74 |
1 |
{error, not_found}; |
75 |
|
[#privacy{default = Default, lists = Lists}] -> |
76 |
2 |
Names = [Name || {Name, _} <- Lists], |
77 |
2 |
{ok, {Default, Names}} |
78 |
|
end. |
79 |
|
|
80 |
|
get_privacy_list(_HostType, LUser, LServer, Name) -> |
81 |
129 |
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of |
82 |
|
{'EXIT', Reason} -> |
83 |
:-( |
{error, Reason}; |
84 |
|
[] -> |
85 |
19 |
{error, not_found}; |
86 |
|
[#privacy{lists = Lists}] -> |
87 |
110 |
case lists:keysearch(Name, 1, Lists) of |
88 |
|
{value, {_, List}} -> |
89 |
109 |
{ok, List}; |
90 |
|
_ -> |
91 |
1 |
{error, not_found} |
92 |
|
end |
93 |
|
end. |
94 |
|
|
95 |
|
%% @doc Set no default list for user. |
96 |
|
forget_default_list(_HostType, LUser, LServer) -> |
97 |
1 |
F = fun() -> |
98 |
1 |
case mnesia:read({privacy, {LUser, LServer}}) of |
99 |
|
[] -> |
100 |
1 |
ok; |
101 |
|
[R] -> |
102 |
:-( |
mnesia:write(R#privacy{default = none}), |
103 |
:-( |
ok |
104 |
|
end |
105 |
|
end, |
106 |
1 |
case mnesia:transaction(F) of |
107 |
|
{atomic, ok} -> |
108 |
1 |
ok; |
109 |
|
{aborted, Reason} -> |
110 |
:-( |
{error, {aborted, Reason}} |
111 |
|
end. |
112 |
|
|
113 |
|
set_default_list(_HostType, LUser, LServer, Name) -> |
114 |
42 |
case mnesia:transaction(fun() -> set_default_list_t(LUser, LServer, Name) end) of |
115 |
|
{atomic, ok} -> |
116 |
41 |
ok; |
117 |
|
{atomic, {error, Reason}} -> |
118 |
1 |
{error, Reason}; |
119 |
|
{aborted, Reason} -> |
120 |
:-( |
{error, {aborted, Reason}} |
121 |
|
end. |
122 |
|
|
123 |
|
-spec set_default_list_t(jid:luser(), jid:lserver(), Name :: binary()) -> |
124 |
|
ok | {error, not_found}. |
125 |
|
set_default_list_t(LUser, LServer, Name) -> |
126 |
42 |
case mnesia:read({privacy, {LUser, LServer}}) of |
127 |
|
[] -> |
128 |
1 |
{error, not_found}; |
129 |
|
[#privacy{lists = Lists} = P] -> |
130 |
41 |
case lists:keymember(Name, 1, Lists) of |
131 |
|
true -> |
132 |
41 |
mnesia:write(P#privacy{default = Name}), |
133 |
41 |
ok; |
134 |
|
false -> |
135 |
:-( |
{error, not_found} |
136 |
|
end |
137 |
|
end. |
138 |
|
|
139 |
|
remove_privacy_list(_HostType, LUser, LServer, Name) -> |
140 |
1 |
F = fun() -> |
141 |
1 |
case mnesia:read({privacy, {LUser, LServer}}) of |
142 |
|
[] -> |
143 |
:-( |
ok; |
144 |
|
[#privacy{default = Default}] when Name == Default -> |
145 |
:-( |
{error, conflict}; |
146 |
|
[#privacy{lists = Lists} = P] -> |
147 |
1 |
NewLists = lists:keydelete(Name, 1, Lists), |
148 |
1 |
mnesia:write(P#privacy{lists = NewLists}), |
149 |
1 |
ok |
150 |
|
end |
151 |
|
end, |
152 |
1 |
case mnesia:transaction(F) of |
153 |
|
{atomic, ok} -> |
154 |
1 |
ok; |
155 |
|
{atomic, {error, _} = Error} -> |
156 |
:-( |
Error; |
157 |
|
{aborted, Reason} -> |
158 |
:-( |
{error, {aborted, Reason}} |
159 |
|
end. |
160 |
|
|
161 |
|
replace_privacy_list(_HostType, LUser, LServer, Name, List) -> |
162 |
77 |
US = {LUser, LServer}, |
163 |
77 |
F = fun() -> |
164 |
77 |
case mnesia:wread({privacy, US}) of |
165 |
|
[] -> |
166 |
62 |
NewLists = [{Name, List}], |
167 |
62 |
mnesia:write(#privacy{us = US, lists = NewLists}), |
168 |
62 |
ok; |
169 |
|
[#privacy{lists = Lists} = P] -> |
170 |
15 |
NewLists1 = lists:keydelete(Name, 1, Lists), |
171 |
15 |
NewLists = [{Name, List} | NewLists1], |
172 |
15 |
mnesia:write(P#privacy{lists = NewLists}), |
173 |
15 |
ok |
174 |
|
end |
175 |
|
end, |
176 |
77 |
case mnesia:transaction(F) of |
177 |
|
{atomic, ok} -> |
178 |
77 |
ok; |
179 |
|
{aborted, Reason} -> |
180 |
:-( |
{error, {aborted, Reason}} |
181 |
|
end. |
182 |
|
|
183 |
|
remove_user(_HostType, LUser, LServer) -> |
184 |
114 |
F = fun() -> mnesia:delete({privacy, {LUser, LServer}}) end, |
185 |
114 |
mnesia:transaction(F). |
186 |
|
|
187 |
|
remove_domain(_HostType, LServer) -> |
188 |
:-( |
F = fun(#privacy{us = {_, LS}} = Rec, _) when LS =:= LServer -> |
189 |
:-( |
mnesia:delete_object(Rec), |
190 |
:-( |
ok; |
191 |
|
(_, _) -> |
192 |
:-( |
ok |
193 |
|
end, |
194 |
:-( |
mnesia:transaction(fun mnesia:foldl/3, [F, ok, privacy]). |