1
%% ``The contents of this file are subject to the Erlang Public License,
2
%% Version 1.1, (the "License"); you may not use this file except in
3
%% compliance with the License. You should have received a copy of the
4
%% Erlang Public License along with this software. If not, it can be
5
%% retrieved via the world wide web at http://www.erlang.org/.
7
%% Software distributed under the License is distributed on an "AS IS"
8
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9
%% the License for the specific language governing rights and limitations
12
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
13
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
14
%% AB. All Rights Reserved.''
16
%% $Id: mod_auth_mnesia.erl,v 1.2 2010/03/04 13:54:19 maria Exp $
18
-module(mod_auth_mnesia).
26
delete_group_member/3,
29
-export([store_user/5, store_user/6,
30
store_group_member/5, store_group_member/6,
31
list_group_members/3, list_group_members/4,
32
list_groups/2, list_groups/3,
33
list_users/2, list_users/3,
34
remove_user/4, remove_user/5,
35
remove_group_member/5, remove_group_member/6,
36
remove_group/4, remove_group/5]).
38
-export([store_directory_data/2]).
40
-include("httpd.hrl").
41
-include("mod_auth.hrl").
45
store_directory_data(Directory, DirData) ->
46
%% We don't need to do anything here, we could ofcourse check that the appropriate
47
%% mnesia tables has been created prior to starting the http server.
58
store_user(UserName, Password, Port, Dir, AccessPassword) ->
59
%% AccessPassword is ignored - was not used in previous version
60
DirData = [{path,Dir},{port,Port}],
61
UStruct = #httpd_user{username = UserName,
63
add_user(DirData, UStruct).
65
store_user(UserName, Password, Addr, Port, Dir, AccessPassword) ->
66
%% AccessPassword is ignored - was not used in previous version
67
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
68
UStruct = #httpd_user{username = UserName,
70
add_user(DirData, UStruct).
72
store_group_member(GroupName, UserName, Port, Dir, AccessPassword) ->
73
DirData = [{path,Dir},{port,Port}],
74
add_group_member(DirData, GroupName, UserName).
76
store_group_member(GroupName, UserName, Addr, Port, Dir, AccessPassword) ->
77
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
78
add_group_member(DirData, GroupName, UserName).
80
list_group_members(GroupName, Port, Dir) ->
81
DirData = [{path,Dir},{port,Port}],
82
list_group_members(DirData, GroupName).
84
list_group_members(GroupName, Addr, Port, Dir) ->
85
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
86
list_group_members(DirData, GroupName).
88
list_groups(Port, Dir) ->
89
DirData = [{path,Dir},{port,Port}],
92
list_groups(Addr, Port, Dir) ->
93
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
96
list_users(Port, Dir) ->
97
DirData = [{path,Dir},{port,Port}],
100
list_users(Addr, Port, Dir) ->
101
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
104
remove_user(UserName, Port, Dir, _AccessPassword) ->
105
DirData = [{path,Dir},{port,Port}],
106
delete_user(DirData, UserName).
108
remove_user(UserName, Addr, Port, Dir, _AccessPassword) ->
109
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
110
delete_user(DirData, UserName).
112
remove_group_member(GroupName,UserName,Port,Dir,_AccessPassword) ->
113
DirData = [{path,Dir},{port,Port}],
114
delete_group_member(DirData, GroupName, UserName).
116
remove_group_member(GroupName,UserName,Addr,Port,Dir,_AccessPassword) ->
117
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
118
delete_group_member(DirData, GroupName, UserName).
120
remove_group(GroupName,Port,Dir,_AccessPassword) ->
121
DirData = [{path,Dir},{port,Port}],
122
delete_group(DirData, GroupName).
124
remove_group(GroupName,Addr,Port,Dir,_AccessPassword) ->
125
DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
126
delete_group(DirData, GroupName).
129
%% Storage format of users in the mnesia table:
130
%% httpd_user records
133
add_user(DirData, UStruct) ->
134
{Addr, Port, Dir} = lookup_common(DirData),
135
UserName = UStruct#httpd_user.username,
136
Password = UStruct#httpd_user.password,
137
Data = UStruct#httpd_user.user_data,
138
User=#httpd_user{username={UserName,Addr,Port,Dir},
141
case mnesia:transaction(fun() -> mnesia:write(User) end) of
148
get_user(DirData, UserName) ->
149
{Addr, Port, Dir} = lookup_common(DirData),
150
case mnesia:transaction(fun() ->
151
mnesia:read({httpd_user,
152
{UserName,Addr,Port,Dir}})
157
{error, no_such_user};
158
{'atomic', [Record]} when record(Record, httpd_user) ->
159
{ok, Record#httpd_user{username=UserName}};
161
{error, no_such_user}
164
list_users(DirData) ->
165
{Addr, Port, Dir} = lookup_common(DirData),
166
case mnesia:transaction(fun() ->
167
mnesia:match_object({httpd_user,
168
{'_',Addr,Port,Dir},'_','_'})
174
lists:foldr(fun({httpd_user, {UserName, AnyAddr, AnyPort, AnyDir},
175
Password, Data}, Acc) ->
181
delete_user(DirData, UserName) ->
182
{Addr, Port, Dir} = lookup_common(DirData),
183
case mnesia:transaction(fun() ->
184
mnesia:delete({httpd_user,
185
{UserName,Addr,Port,Dir}})
194
%% Storage of groups in the mnesia table:
195
%% Multiple instances of {#httpd_group, User}
198
add_group_member(DirData, GroupName, User) ->
199
{Addr, Port, Dir} = lookup_common(DirData),
200
Group=#httpd_group{name={GroupName, Addr, Port, Dir}, userlist=User},
201
case mnesia:transaction(fun() -> mnesia:write(Group) end) of
208
list_group_members(DirData, GroupName) ->
209
{Addr, Port, Dir} = lookup_common(DirData),
210
case mnesia:transaction(fun() ->
211
mnesia:read({httpd_group,
212
{GroupName,Addr,Port,Dir}})
216
{'atomic', Members} ->
217
{ok,[UserName || {httpd_group,{AnyGroupName,AnyAddr,AnyPort,AnyDir},UserName} <- Members,
218
AnyGroupName == GroupName, AnyAddr == Addr,
219
AnyPort == Port, AnyDir == Dir]}
222
list_groups(DirData) ->
223
{Addr, Port, Dir} = lookup_common(DirData),
224
case mnesia:transaction(fun() ->
225
mnesia:match_object({httpd_group,
226
{'_',Addr,Port,Dir},'_'})
230
{'atomic', Groups} ->
232
[GroupName || {httpd_group,{GroupName,AnyAddr,AnyPort,AnyDir}, UserName} <- Groups,
233
AnyAddr == Addr, AnyPort == AnyPort, AnyDir == Dir],
234
{ok, httpd_util:uniq(lists:sort(GroupNames))}
237
delete_group_member(DirData, GroupName, UserName) ->
238
{Addr, Port, Dir} = lookup_common(DirData),
239
Group = #httpd_group{name={GroupName, Addr, Port, Dir}, userlist=UserName},
240
case mnesia:transaction(fun() -> mnesia:delete_object(Group) end) of
247
%% THIS IS WRONG (?) !
248
%% Should first match out all httpd_group records for this group and then
249
%% do mnesia:delete on those. Or ?
251
delete_group(DirData, GroupName) ->
252
{Addr, Port, Dir} = lookup_common(DirData),
253
case mnesia:transaction(fun() ->
254
mnesia:delete({httpd_group,
255
{GroupName,Addr,Port,Dir}})
263
%% Utility functions.
265
lookup_common(DirData) ->
266
Dir = httpd_util:key1search(DirData, path),
267
Port = httpd_util:key1search(DirData, port),
268
Addr = httpd_util:key1search(DirData, bind_address),