./ct_report/coverage/mod_privacy_riak.COVER.html

1 %%==============================================================================
2 %% Copyright 2015 Guillaume Bour.
3 %%
4 %% Licensed under the Apache License, Version 2.0 (the "License");
5 %% you may not use this file except in compliance with the License.
6 %% You may obtain a copy of the License at
7 %%
8 %% http://www.apache.org/licenses/LICENSE-2.0
9 %%
10 %% Unless required by applicable law or agreed to in writing, software
11 %% distributed under the License is distributed on an "AS IS" BASIS,
12 %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 %% See the License for the specific language governing permissions and
14 %% limitations under the License.
15 %%==============================================================================
16
17 %
18 % NOTES:
19 % user default privacy is stored in
20 % bucket {<<"privacy_defaults">>, LServer}, key LUser@LServer
21 % user privacy lists names are stored in
22 % set {<<"privacy_lists_names">>, <<"LServer">>}, key LUser@LServer
23 % user privacy lists content are stored in
24 % bucket {<<"privacy_lists">>, LServer}, key LUser@LServer/ListName
25
26 -module(mod_privacy_riak).
27 -author('guillaume@bour.cc').
28 -behaviour(mod_privacy_backend).
29
30 -export([init/2,
31 get_default_list/3,
32 get_list_names/3,
33 get_privacy_list/4,
34 set_default_list/4,
35 forget_default_list/3,
36 remove_privacy_list/4,
37 replace_privacy_list/5,
38 remove_user/3,
39 remove_domain/2]).
40
41 -include("mongoose.hrl").
42 -include("jlib.hrl").
43 -include("mod_privacy.hrl").
44
45 -include_lib("riakc/include/riakc.hrl").
46
47 get_bucket_name(HostType, Opt) ->
48
:-(
{gen_mod:get_module_opt(HostType, mod_privacy, [riak, Opt]), HostType}.
49
50 -define(BKT_DEFAULT_LIST(HostType),
51 get_bucket_name(HostType, defaults_bucket_type)).
52 -define(BKT_LISTS_NAMES(HostType),
53 get_bucket_name(HostType, names_bucket_type)).
54 -define(BKT_LISTS(HostType),
55 get_bucket_name(HostType, bucket_type)).
56
57 init(_HostType, _Opts) ->
58
:-(
ok.
59
60 get_default_list(HostType, LUser, LServer) ->
61
:-(
case get_default_list_name(HostType, LUser, LServer) of
62 none ->
63
:-(
{error, not_found};
64 Default ->
65
:-(
case get_privacy_list(HostType, LUser, LServer, Default) of
66 {ok, List} ->
67
:-(
{ok, {Default, List}};
68 {error, Reason} ->
69
:-(
{error, Reason}
70 end
71 end.
72
73 get_list_names(HostType, LUser, LServer) ->
74
:-(
Default = get_default_list_name(HostType, LUser, LServer),
75
:-(
Names = get_list_names_only(HostType, LUser, LServer),
76
:-(
{ok, {Default, Names}}.
77
78 -spec get_default_list_name(mongooseim:host_type(), jid:luser(), jid:lserver()) -> binary() | none.
79 get_default_list_name(HostType, LUser, LServer) ->
80
:-(
case mongoose_riak:get(?BKT_DEFAULT_LIST(HostType), key(LUser, LServer)) of
81 {ok, Obj} ->
82
:-(
riakc_obj:get_value(Obj);
83
:-(
_ -> none
84 end.
85
86 -spec get_list_names_only(mongooseim:host_type(), jid:luser(), jid:lserver()) -> list(binary()).
87 get_list_names_only(HostType, LUser, LServer) ->
88
:-(
case mongoose_riak:fetch_type(?BKT_LISTS_NAMES(HostType), key(LUser, LServer)) of
89 {ok, Set} ->
90
:-(
riakc_set:value(Set);
91 {error, {notfound, set}} ->
92
:-(
[];
93 Err ->
94
:-(
?LOG_ERROR(#{what => privacy_get_list_names_only_failed,
95
:-(
user => LUser, server => LServer, reason => Err}),
96
:-(
[]
97 end.
98
99 get_privacy_list(HostType, LUser, LServer, Name) ->
100
:-(
case mongoose_riak:get(?BKT_LISTS(HostType), key(LUser, LServer, Name)) of
101 {ok, Obj} ->
102
:-(
Val = binary_to_term(riakc_obj:get_value(Obj)),
103
:-(
{ok, Val};
104 {error, notfound} ->
105
:-(
{error, not_found};
106 Err ->
107
:-(
?LOG_ERROR(#{what => privacy_get_list_names_only_failed,
108 user => LUser, server => LServer, list_name => Name,
109
:-(
reason => Err}),
110
:-(
Err
111 end.
112
113 forget_default_list(HostType, LUser, LServer) ->
114
:-(
mongoose_riak:delete(?BKT_DEFAULT_LIST(HostType), key(LUser, LServer)).
115
116 set_default_list(HostType, LUser, LServer, Name) ->
117
:-(
case mongoose_riak:get(?BKT_LISTS(HostType), key(LUser, LServer, Name)) of
118 {ok, _} ->
119 % create or update
120
:-(
Obj = riakc_obj:new(?BKT_DEFAULT_LIST(HostType), key(LUser, LServer), Name),
121
:-(
mongoose_riak:put(Obj);
122 % in case list name is not found
123 {error, notfound} ->
124
:-(
{error, not_found};
125
:-(
Err -> Err
126 end.
127
128 remove_privacy_list(HostType, LUser, LServer, Name) ->
129
:-(
mongoose_riak:delete(?BKT_LISTS(HostType), key(LUser, LServer, Name)),
130
131
:-(
case mongoose_riak:fetch_type(?BKT_LISTS_NAMES(HostType), key(LUser, LServer)) of
132 {ok, S1} ->
133
:-(
S2 = riakc_set:del_element(Name, S1),
134
:-(
mongoose_riak:update_type(?BKT_LISTS_NAMES(HostType), key(LUser, LServer), riakc_set:to_op(S2));
135 Err ->
136
:-(
?LOG_ERROR(#{what => privacy_remove_privacy_list_failed,
137 user => LUser, server => LServer, list_name => Name,
138
:-(
reason => Err}),
139
:-(
Err
140 end.
141
142 replace_privacy_list(HostType, LUser, LServer, Name, List) ->
143 % store privacy-list content
144
:-(
BinaryList = term_to_binary(List),
145
:-(
Obj = riakc_obj:new(?BKT_LISTS(HostType), key(LUser, LServer, Name), BinaryList),
146
:-(
mongoose_riak:put(Obj),
147
148 % add new list name to user privacy-lists set
149
:-(
S = riakc_set:add_element(Name, riakc_set:new()),
150
:-(
mongoose_riak:update_type(?BKT_LISTS_NAMES(HostType), key(LUser, LServer), riakc_set:to_op(S)).
151
152 remove_user(HostType, LUser, LServer) ->
153
:-(
forget_default_list(HostType, LUser, LServer),
154
:-(
lists:foreach(
155
:-(
fun(Name) -> remove_privacy_list(HostType, LUser, LServer, Name) end,
156 get_list_names_only(HostType, LUser, LServer)
157 ),
158
:-(
mongoose_riak:delete(?BKT_LISTS_NAMES(HostType), key(LUser, LServer)).
159
160 %% TODO
161 remove_domain(_HostType, _LServer) ->
162
:-(
ok.
163 % forget_default_list(HostType, <<>>, LServer),
164 % lists:foreach(
165 % fun(Name) -> remove_privacy_list(HostType, <<>>, LServer, Name) end,
166 % get_list_names_only(HostType, <<>>, LServer)
167 % ),
168 % mongoose_riak:delete(?BKT_LISTS_NAMES(HostType), key(<<>>, LServer)).
169
170 key(LUser, LServer) ->
171
:-(
jid:to_binary({LUser, LServer}).
172 key(LUser, LServer, Name) ->
173
:-(
jid:to_binary({LUser, LServer, Name}).
Line Hits Source