⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_auth_plain.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(mod_auth_plain).-include("httpd.hrl").-include("mod_auth.hrl").-define(VMODULE,"AUTH_PLAIN").%% Internal API-export([store_directory_data/2]).-export([get_user/2, 	 list_group_members/2, 	 add_user/2, 	 add_group_member/3, 	 list_users/1, 	 delete_user/2, 	 list_groups/1, 	 delete_group_member/3, 	 delete_group/2, 	 remove/1]).%%%% API%%%%%% Storage format of users in the ets table:%% {UserName, Password, UserData}%%add_user(DirData, #httpd_user{username = User} = UStruct) ->    PWDB = httpd_util:key1search(DirData, auth_user_file),    Record = {User,	      UStruct#httpd_user.password, 	      UStruct#httpd_user.user_data},     case ets:lookup(PWDB, User) of	[{User, _SomePassword, _SomeData}] ->	    {error, user_already_in_db};	_ ->	    ets:insert(PWDB, Record),	    true    end.get_user(DirData, User) ->    PWDB = httpd_util:key1search(DirData, auth_user_file),    case ets:lookup(PWDB, User) of	[{User, PassWd, Data}] ->	    {ok, #httpd_user{username=User, password=PassWd, user_data=Data}};	_ ->	    {error, no_such_user}    end.list_users(DirData) ->    PWDB = httpd_util:key1search(DirData, auth_user_file),    Records = ets:match(PWDB, '$1'),     {ok, lists:foldr(fun({User, _PassWd, _Data}, A) -> [User | A] end, 		     [], lists:flatten(Records))}.delete_user(DirData, UserName) ->    PWDB = httpd_util:key1search(DirData, auth_user_file),    case ets:lookup(PWDB, UserName) of	[{UserName, _SomePassword, _SomeData}] ->	    ets:delete(PWDB, UserName),	    {ok, Groups}  = list_groups(DirData),	    lists:foreach(fun(Group) -> 				  delete_group_member(DirData, 						      Group, UserName) 			  end, Groups);	_ ->	    {error, no_such_user}    end.%%%% Storage of groups in the ets table:%% {Group, UserList} where UserList is a list of strings.%%  add_group_member(DirData, Group, UserName) ->    GDB = httpd_util:key1search(DirData, auth_group_file),    case ets:lookup(GDB, Group) of	[{Group, Users}] ->	    case lists:member(UserName, Users) of		true ->		    true;		false ->		    ets:insert(GDB, {Group, [UserName|Users]}),		    true	    end;	[] ->	    ets:insert(GDB, {Group, [UserName]}),	    true;	Other ->	    {error, Other}    end.list_group_members(DirData, Group) ->    GDB = httpd_util:key1search(DirData, auth_group_file),    case ets:lookup(GDB, Group) of	[{Group, Users}] ->	    {ok, Users};	_ ->	    {error, no_such_group}    end.list_groups(DirData) ->    GDB = httpd_util:key1search(DirData, auth_group_file),    Groups = ets:match(GDB, '$1'),     {ok, httpd_util:uniq(lists:foldr(fun({G, _}, A) -> [G|A] end,				     [], lists:flatten(Groups)))}.delete_group_member(DirData, Group, User) ->    GDB = httpd_util:key1search(DirData, auth_group_file),    case ets:lookup(GDB, Group) of	[{Group, Users}] when is_list(Users) ->	    case lists:member(User, Users) of		true ->		    ets:delete(GDB, Group),		    ets:insert(GDB, {Group, lists:delete(User, Users)}),		    true;		false ->		    {error, no_such_group_member}	    end;	_ ->	    {error, no_such_group}    end.delete_group(DirData, Group) ->    GDB = httpd_util:key1search(DirData, auth_group_file),    case ets:lookup(GDB, Group) of	[{Group, _Users}] ->	    ets:delete(GDB, Group),	    true;	_ ->	    {error, no_such_group}    end.store_directory_data(_Directory, DirData) ->    PWFile = httpd_util:key1search(DirData, auth_user_file),    GroupFile = httpd_util:key1search(DirData, auth_group_file),    case load_passwd(PWFile) of	{ok, PWDB} ->	    case load_group(GroupFile) of		{ok, GRDB} ->		    %% Address and port is included in the file names...		    Addr = httpd_util:key1search(DirData, bind_address),		    Port = httpd_util:key1search(DirData, port),		    {ok, PasswdDB} = store_passwd(Addr,Port,PWDB),		    {ok, GroupDB}  = store_group(Addr,Port,GRDB),		    NDD1 = lists:keyreplace(auth_user_file, 1, DirData, 					    {auth_user_file, PasswdDB}),		    NDD2 = lists:keyreplace(auth_group_file, 1, NDD1, 					    {auth_group_file, GroupDB}),		    {ok, NDD2};		Err ->		    {error, Err}	    end;	Err2 ->	    {error, Err2}    end.%% load_passwdload_passwd(AuthUserFile) ->    case file:open(AuthUserFile, read) of	{ok,Stream} ->	    parse_passwd(Stream, []);	{error, _} ->	    {error, ?NICE("Can't open "++AuthUserFile)}    end.parse_passwd(Stream,PasswdList) ->    Line =	case io:get_line(Stream, '') of	    eof ->		eof;	    String ->		httpd_conf:clean(String)	end,    parse_passwd(Stream, PasswdList, Line).parse_passwd(Stream, PasswdList, eof) ->    file:close(Stream),    {ok, PasswdList};parse_passwd(Stream, PasswdList, "") ->    parse_passwd(Stream, PasswdList);parse_passwd(Stream, PasswdList, [$#|_]) ->    parse_passwd(Stream, PasswdList);parse_passwd(Stream, PasswdList, Line) ->          case regexp:split(Line,":") of	{ok, [User,Password]} ->	    parse_passwd(Stream, [{User,Password, []}|PasswdList]);	{ok,_} ->	    {error, ?NICE(Line)}    end.%% load_groupload_group(AuthGroupFile) ->    case file:open(AuthGroupFile, read) of	{ok, Stream} ->	    parse_group(Stream,[]);	{error, _} ->	    {error, ?NICE("Can't open "++AuthGroupFile)}    end.parse_group(Stream, GroupList) ->    Line=	case io:get_line(Stream,'') of	    eof ->		eof;	    String ->		httpd_conf:clean(String)	end,    parse_group(Stream, GroupList, Line).parse_group(Stream, GroupList, eof) ->    file:close(Stream),    {ok, GroupList};parse_group(Stream, GroupList, "") ->    parse_group(Stream, GroupList);parse_group(Stream, GroupList, [$#|_]) ->    parse_group(Stream, GroupList);parse_group(Stream, GroupList, Line) ->          case regexp:split(Line, ":") of	{ok, [Group,Users]} ->	    {ok, UserList} = regexp:split(Users," "),	    parse_group(Stream, [{Group,UserList}|GroupList]);	{ok, _} ->	    {error, ?NICE(Line)}    end.%% store_passwdstore_passwd(Addr,Port,PasswdList) ->    Name = httpd_util:make_name("httpd_passwd",Addr,Port),    PasswdDB = ets:new(Name, [set, public]),    store_passwd(PasswdDB, PasswdList).store_passwd(PasswdDB, []) ->    {ok, PasswdDB};store_passwd(PasswdDB, [User|Rest]) ->    ets:insert(PasswdDB, User),    store_passwd(PasswdDB, Rest).%% store_groupstore_group(Addr,Port,GroupList) ->    Name = httpd_util:make_name("httpd_group",Addr,Port),    GroupDB = ets:new(Name, [set, public]),    store_group(GroupDB, GroupList).store_group(GroupDB,[]) ->    {ok, GroupDB};store_group(GroupDB,[User|Rest]) ->    ets:insert(GroupDB, User),    store_group(GroupDB, Rest).%% remove/1%%%% Deletes ets tables used by this auth mod.%%remove(DirData) ->    PWDB = httpd_util:key1search(DirData, auth_user_file),    GDB = httpd_util:key1search(DirData, auth_group_file),    ets:delete(PWDB),    ets:delete(GDB).

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -