~ubuntu-branches/ubuntu/trusty/erlang/trusty

« back to all changes in this revision

Viewing changes to lib/dialyzer/test/r9c_tests_SUITE_data/src/inets/mod_auth_server.erl

  • Committer: Bazaar Package Importer
  • Author(s): Clint Byrum
  • Date: 2011-05-05 15:48:43 UTC
  • mfrom: (3.5.13 sid)
  • Revision ID: james.westby@ubuntu.com-20110505154843-0om6ekzg6m7ugj27
Tags: 1:14.b.2-dfsg-3ubuntu1
* Merge from debian unstable.  Remaining changes:
  - Drop libwxgtk2.8-dev build dependency. Wx isn't in main, and not
    supposed to.
  - Drop erlang-wx binary.
  - Drop erlang-wx dependency from -megaco, -common-test, and -reltool, they
    do not really need wx. Also drop it from -debugger; the GUI needs wx,
    but it apparently has CLI bits as well, and is also needed by -megaco,
    so let's keep the package for now.
  - debian/patches/series: Do what I meant, and enable build-options.patch
    instead.
* Additional changes:
  - Drop erlang-wx from -et
* Dropped Changes:
  - patches/pcre-crash.patch: CVE-2008-2371: outer level option with
    alternatives caused crash. (Applied Upstream)
  - fix for ssl certificate verification in newSSL: 
    ssl_cacertfile_fix.patch (Applied Upstream)
  - debian/patches/series: Enable native.patch again, to get stripped beam
    files and reduce the package size again. (build-options is what
    actually accomplished this)
  - Remove build-options.patch on advice from upstream and because it caused
    odd build failures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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/.
 
6
%% 
 
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
 
10
%% under the License.
 
11
%% 
 
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.''
 
15
%% 
 
16
%%     $Id: mod_auth_server.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
 
17
%%
 
18
 
 
19
-module(mod_auth_server).
 
20
 
 
21
-include("httpd.hrl").
 
22
%% -include("mod_auth.hrl").
 
23
-include("httpd_verbosity.hrl").
 
24
 
 
25
-behaviour(gen_server).
 
26
 
 
27
 
 
28
%% mod_auth exports 
 
29
-export([start/2, stop/2, 
 
30
         add_password/4, update_password/5, 
 
31
         add_user/5, delete_user/5, get_user/5, list_users/4, 
 
32
         add_group_member/6, delete_group_member/6, list_group_members/5, 
 
33
         delete_group/5, list_groups/4]).
 
34
 
 
35
%% Management exports
 
36
-export([verbosity/3]).
 
37
 
 
38
%% gen_server exports
 
39
-export([start_link/3,
 
40
         init/1,
 
41
         handle_call/3, handle_cast/2, handle_info/2,
 
42
         terminate/2, code_change/3]).
 
43
 
 
44
 
 
45
-record(state,{tab}).
 
46
 
 
47
 
 
48
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
49
%%                                                                  %%
 
50
%% External API                                                     %%
 
51
%%                                                                  %%
 
52
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
53
 
 
54
%% start_link/3
 
55
%% 
 
56
%% NOTE: This is called by httpd_misc_sup when the process is started
 
57
%% 
 
58
start_link(Addr, Port, Verbosity)->
 
59
    ?vlog("start_link -> entry with"
 
60
          "~n   Addr: ~p"
 
61
          "~n   Port: ~p", [Addr, Port]),
 
62
    Name = make_name(Addr, Port),
 
63
    gen_server:start_link({local, Name}, ?MODULE, [Verbosity],
 
64
                          [{timeout, infinity}]).
 
65
 
 
66
 
 
67
%% start/2
 
68
 
 
69
start(Addr, Port)->
 
70
    ?vtrace("start -> entry with"
 
71
            "~n   Addr: ~p"
 
72
            "~n   Port: ~p", [Addr, Port]),
 
73
    Name = make_name(Addr, Port),
 
74
    case whereis(Name) of
 
75
        undefined ->
 
76
           Verbosity = get(auth_verbosity),
 
77
           case (catch httpd_misc_sup:start_auth_server(Addr, Port, 
 
78
                                                        Verbosity)) of
 
79
                {ok, Pid} ->
 
80
                    put(auth_server, Pid),
 
81
                    ok;
 
82
                {error, Reason} ->
 
83
                    exit({failed_start_auth_server, Reason});
 
84
                Error ->
 
85
                    exit({failed_start_auth_server, Error})
 
86
            end;
 
87
        _ -> %% Already started...
 
88
            ok
 
89
    end.
 
90
 
 
91
 
 
92
%% stop/2
 
93
 
 
94
stop(Addr, Port)->
 
95
    ?vtrace("stop -> entry with"
 
96
            "~n   Addr: ~p"
 
97
            "~n   Port: ~p", [Addr, Port]),
 
98
    Name = make_name(Addr, Port),
 
99
    case whereis(Name) of
 
100
        undefined -> %% Already stopped
 
101
            ok;
 
102
        _ ->
 
103
           (catch httpd_misc_sup:stop_auth_server(Addr, Port))
 
104
    end.
 
105
 
 
106
 
 
107
%% verbosity/3
 
108
 
 
109
verbosity(Addr, Port, Verbosity) ->
 
110
    Name = make_name(Addr, Port),
 
111
    Req  = {verbosity, Verbosity},
 
112
    call(Name, Req).
 
113
 
 
114
 
 
115
%% add_password/4
 
116
 
 
117
add_password(Addr, Port, Dir, Password)->
 
118
    Name = make_name(Addr, Port),
 
119
    Req  = {add_password, Dir, Password},
 
120
    call(Name, Req).
 
121
 
 
122
 
 
123
%% update_password/6
 
124
 
 
125
update_password(Addr, Port, Dir, Old, New) when list(New) ->
 
126
    Name = make_name(Addr, Port),
 
127
    Req  = {update_password, Dir, Old, New},
 
128
    call(Name, Req).
 
129
           
 
130
 
 
131
%% add_user/5
 
132
 
 
133
add_user(Addr, Port, Dir, User, Password) ->
 
134
    Name = make_name(Addr, Port),
 
135
    Req  = {add_user, Addr, Port, Dir, User, Password},
 
136
    call(Name, Req).
 
137
 
 
138
 
 
139
%% delete_user/5
 
140
 
 
141
delete_user(Addr, Port, Dir, UserName, Password) ->
 
142
    Name = make_name(Addr, Port),
 
143
    Req  = {delete_user, Addr, Port, Dir, UserName, Password},
 
144
    call(Name, Req).
 
145
 
 
146
 
 
147
%% get_user/5
 
148
 
 
149
get_user(Addr, Port, Dir, UserName, Password) ->
 
150
    Name = make_name(Addr, Port),
 
151
    Req  = {get_user, Addr, Port, Dir, UserName, Password},
 
152
    call(Name, Req).
 
153
 
 
154
 
 
155
%% list_users/4
 
156
 
 
157
list_users(Addr, Port, Dir, Password) ->
 
158
    Name = make_name(Addr,Port),
 
159
    Req  = {list_users, Addr, Port, Dir, Password},
 
160
    call(Name, Req).
 
161
 
 
162
 
 
163
%% add_group_member/6
 
164
 
 
165
add_group_member(Addr, Port, Dir, GroupName, UserName, Password) ->
 
166
    Name = make_name(Addr,Port),
 
167
    Req  = {add_group_member, Addr, Port, Dir, GroupName, UserName, Password},
 
168
    call(Name, Req).
 
169
 
 
170
 
 
171
%% delete_group_member/6
 
172
 
 
173
delete_group_member(Addr, Port, Dir, GroupName, UserName, Password) ->
 
174
    Name = make_name(Addr,Port),
 
175
    Req  = {delete_group_member, Addr, Port, Dir, GroupName, UserName, Password},
 
176
    call(Name, Req).
 
177
 
 
178
 
 
179
%% list_group_members/4
 
180
 
 
181
list_group_members(Addr, Port, Dir, Group, Password) ->
 
182
    Name = make_name(Addr, Port),
 
183
    Req  = {list_group_members, Addr, Port, Dir, Group, Password},
 
184
    call(Name, Req).
 
185
 
 
186
 
 
187
%% delete_group/5
 
188
 
 
189
delete_group(Addr, Port, Dir, GroupName, Password) ->
 
190
    Name = make_name(Addr, Port),
 
191
    Req  = {delete_group, Addr, Port, Dir, GroupName, Password},
 
192
    call(Name, Req).
 
193
 
 
194
 
 
195
%% list_groups/4
 
196
 
 
197
list_groups(Addr, Port, Dir, Password) ->
 
198
    Name = make_name(Addr, Port),
 
199
    Req  = {list_groups, Addr, Port, Dir, Password},
 
200
    call(Name, Req).
 
201
 
 
202
 
 
203
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
204
%%                                                                  %%
 
205
%% Server call-back functions                                       %%
 
206
%%                                                                  %%
 
207
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
208
 
 
209
%% init
 
210
 
 
211
init([undefined]) ->
 
212
    init([?default_verbosity]);
 
213
 
 
214
init([Verbosity]) ->
 
215
    put(sname,auth),
 
216
    put(verbosity,Verbosity),
 
217
    ?vlog("starting",[]),
 
218
    {ok,#state{tab = ets:new(auth_pwd,[set,protected])}}.
 
219
 
 
220
 
 
221
%% handle_call
 
222
 
 
223
%% Add a user
 
224
handle_call({add_user, Addr, Port, Dir, User, AuthPwd}, _From, State) ->
 
225
    Reply = api_call(Addr, Port, Dir, add_user, User, AuthPwd, State),
 
226
    {reply, Reply, State};
 
227
 
 
228
%% Get data about a user
 
229
handle_call({get_user, Addr, Port, Dir, User, AuthPwd}, _From, State) ->
 
230
    Reply = api_call(Addr, Port, Dir, get_user, [User], AuthPwd, State),
 
231
    {reply, Reply, State};
 
232
 
 
233
%% Add a group member
 
234
handle_call({add_group_member, Addr, Port, Dir, Group, User, AuthPwd},
 
235
            _From, State) ->
 
236
    Reply = api_call(Addr, Port, Dir, add_group_member, [Group, User], 
 
237
                     AuthPwd, State),
 
238
    {reply, Reply, State};
 
239
 
 
240
%% delete a group
 
241
handle_call({delete_group_member, Addr, Port, Dir, Group, User, AuthPwd},
 
242
            _From, State)->
 
243
    Reply = api_call(Addr, Port, Dir, delete_group_member, [Group, User], 
 
244
                     AuthPwd, State), 
 
245
    {reply, Reply, State};
 
246
 
 
247
%% List all users thats standalone users
 
248
handle_call({list_users, Addr, Port, Dir, AuthPwd}, _From, State)->
 
249
    Reply = api_call(Addr, Port, Dir, list_users, [], AuthPwd, State),
 
250
    {reply, Reply, State};
 
251
 
 
252
%% Delete a user
 
253
handle_call({delete_user, Addr, Port, Dir, User, AuthPwd}, _From, State)->
 
254
    Reply = api_call(Addr, Port, Dir, delete_user, [User], AuthPwd, State),
 
255
    {reply, Reply, State};
 
256
 
 
257
%% Delete a group
 
258
handle_call({delete_group, Addr, Port, Dir, Group, AuthPwd}, _From, State)->
 
259
    Reply = api_call(Addr, Port, Dir, delete_group, [Group], AuthPwd, State),
 
260
    {reply, Reply, State};
 
261
 
 
262
%% List the current groups
 
263
handle_call({list_groups, Addr, Port, Dir, AuthPwd}, _From, State)->
 
264
    Reply = api_call(Addr, Port, Dir, list_groups, [], AuthPwd, State),
 
265
    {reply, Reply, State};
 
266
 
 
267
%% List the members of the given group
 
268
handle_call({list_group_members, Addr, Port, Dir, Group, AuthPwd},
 
269
            _From, State)->
 
270
    Reply = api_call(Addr, Port, Dir, list_group_members, [Group],
 
271
                     AuthPwd, State), 
 
272
    {reply, Reply, State};
 
273
 
 
274
 
 
275
%% Add password for a directory
 
276
handle_call({add_password, Dir, Password}, _From, State)->
 
277
    Reply = do_add_password(Dir, Password, State),
 
278
    {reply, Reply, State};
 
279
 
 
280
 
 
281
%% Update the password for a directory
 
282
  
 
283
handle_call({update_password, Dir, Old, New},_From,State)->
 
284
    Reply = 
 
285
        case getPassword(State, Dir) of
 
286
            OldPwd when binary(OldPwd)->
 
287
                case erlang:md5(Old) of
 
288
                    OldPwd ->
 
289
                        %% The old password is right =>
 
290
                        %% update the password to the new
 
291
                        do_update_password(Dir,New,State),
 
292
                        ok;
 
293
                _->
 
294
                    {error, error_new}
 
295
            end;
 
296
        _->
 
297
            {error, error_old}
 
298
    end,
 
299
    {reply, Reply, State};
 
300
 
 
301
handle_call(stop, _From, State)->
 
302
    {stop, normal, State};
 
303
 
 
304
handle_call({verbosity,Verbosity},_From,State)->
 
305
    OldVerbosity = put(verbosity,Verbosity),
 
306
    ?vlog("set verbosity:  ~p -> ~p",[Verbosity,OldVerbosity]),
 
307
    {reply,OldVerbosity,State}.
 
308
 
 
309
handle_info(Info,State)->
 
310
    {noreply,State}.
 
311
 
 
312
handle_cast(Request,State)->
 
313
    {noreply,State}.
 
314
    
 
315
 
 
316
terminate(Reason,State) ->
 
317
    ets:delete(State#state.tab),
 
318
    ok.
 
319
 
 
320
 
 
321
%% code_change({down, ToVsn}, State, Extra)
 
322
%% 
 
323
code_change({down, _}, #state{tab = Tab}, downgrade_to_2_6_0) ->
 
324
    ?vlog("downgrade to 2.6.0", []),
 
325
    {ok, {state, Tab, undefined}};
 
326
 
 
327
 
 
328
%% code_change(FromVsn, State, Extra)
 
329
%%
 
330
code_change(_, {state, Tab, _}, upgrade_from_2_6_0) ->
 
331
    ?vlog("upgrade from 2.6.0", []),
 
332
    {ok, #state{tab = Tab}}.
 
333
 
 
334
 
 
335
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
336
%%                                                                  %%
 
337
%% The functions that really changes the data in the database       %%
 
338
%% of users to different directories                                %%
 
339
%%                                                                  %%
 
340
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
341
 
 
342
%% API gateway
 
343
 
 
344
api_call(Addr, Port, Dir, Func, Args,Password,State) ->
 
345
    case controlPassword(Password,State,Dir) of
 
346
        ok->
 
347
            ConfigName = httpd_util:make_name("httpd_conf",Addr,Port),
 
348
            case ets:match_object(ConfigName, {directory, Dir, '$1'}) of
 
349
                [{directory, Dir, DirData}] ->
 
350
                    AuthMod = auth_mod_name(DirData),
 
351
                    ?DEBUG("api_call -> call ~p:~p",[AuthMod,Func]),
 
352
                    Ret = (catch apply(AuthMod, Func, [DirData|Args])),
 
353
                    ?DEBUG("api_call -> Ret: ~p",[ret]),
 
354
                    Ret;
 
355
                O ->
 
356
                    ?DEBUG("api_call -> O: ~p",[O]),
 
357
                    {error, no_such_directory}
 
358
            end;
 
359
        bad_password ->
 
360
            {error,bad_password}
 
361
    end.
 
362
 
 
363
controlPassword(Password,State,Dir)when Password=:="DummyPassword"->
 
364
    bad_password;
 
365
 
 
366
controlPassword(Password,State,Dir)->
 
367
    case getPassword(State,Dir) of
 
368
        Pwd when binary(Pwd)->
 
369
            case erlang:md5(Password) of
 
370
                Pwd ->
 
371
                    ok;
 
372
                _->
 
373
                    bad_password
 
374
            end;
 
375
        _ ->
 
376
            bad_password
 
377
    end.
 
378
 
 
379
    
 
380
getPassword(State,Dir)->
 
381
    case lookup(State#state.tab, Dir) of
 
382
        [{_,Pwd}]->
 
383
            Pwd;
 
384
        _ ->
 
385
            {error,bad_password}
 
386
    end.
 
387
 
 
388
do_update_password(Dir, New, State) ->
 
389
    ets:insert(State#state.tab, {Dir, erlang:md5(New)}).
 
390
 
 
391
do_add_password(Dir, Password, State) ->
 
392
    case getPassword(State,Dir) of
 
393
        PwdExists when binary(PwdExists) ->
 
394
            {error, dir_protected};
 
395
        {error, _} ->
 
396
            do_update_password(Dir, Password, State)
 
397
    end.
 
398
            
 
399
 
 
400
auth_mod_name(DirData) ->
 
401
    case httpd_util:key1search(DirData, auth_type, plain) of
 
402
        plain ->    mod_auth_plain;
 
403
        mnesia ->   mod_auth_mnesia;
 
404
        dets ->     mod_auth_dets
 
405
    end.
 
406
 
 
407
    
 
408
lookup(Db, Key) ->
 
409
    ets:lookup(Db, Key).
 
410
 
 
411
 
 
412
make_name(Addr,Port) ->
 
413
    httpd_util:make_name("httpd_auth",Addr,Port).
 
414
 
 
415
 
 
416
call(Name, Req) ->
 
417
    case (catch gen_server:call(Name, Req)) of
 
418
        {'EXIT', Reason} ->
 
419
            {error, Reason};
 
420
        Reply ->
 
421
            Reply
 
422
    end.
 
423
    
 
424