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, Default) -> |
48 |
:-( |
{gen_mod:get_module_opt(HostType, mod_privacy, Opt, Default), HostType}. |
49 |
|
|
50 |
|
-define(BKT_DEFAULT_LIST(HostType), |
51 |
|
get_bucket_name(HostType, defaults_bucket_type, <<"privacy_defaults">>)). |
52 |
|
-define(BKT_LISTS_NAMES(HostType), |
53 |
|
get_bucket_name(HostType, names_bucket_type, <<"privacy_lists_names">>)). |
54 |
|
-define(BKT_LISTS(HostType), |
55 |
|
get_bucket_name(HostType, bucket_type, <<"privacy_lists">>)). |
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}). |