aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_auth_internal.erl
diff options
context:
space:
mode:
authortmallard <tmallard@null>2005-04-17 18:08:34 +0000
committertmallard <tmallard@null>2005-04-17 18:08:34 +0000
commit374446f8471747c878cdaf760c4bb37d17493ab7 (patch)
treee91bac5669555dcf33627e4745b04236f743126d /src/ejabberd_auth_internal.erl
parent* src/ejabberd_c2s.erl: Send new id for each new stream inside one (diff)
Merged the Process One contributions ( Virtual Hosting )
SVN Revision: 307
Diffstat (limited to 'src/ejabberd_auth_internal.erl')
-rw-r--r--src/ejabberd_auth_internal.erl158
1 files changed, 119 insertions, 39 deletions
diff --git a/src/ejabberd_auth_internal.erl b/src/ejabberd_auth_internal.erl
index 1743c8478..8dbd58818 100644
--- a/src/ejabberd_auth_internal.erl
+++ b/src/ejabberd_auth_internal.erl
@@ -12,44 +12,52 @@
%% External exports
-export([start/0,
- set_password/2,
- check_password/2,
- check_password/4,
- try_register/2,
+ set_password/3,
+ check_password/3,
+ check_password/5,
+ try_register/3,
dirty_get_registered_users/0,
- get_password/1,
- get_password_s/1,
- is_user_exists/1,
- remove_user/1,
+ get_vh_registered_users/1,
+ get_password/2,
+ get_password_s/2,
+ is_user_exists/2,
remove_user/2,
+ remove_user/3,
plain_password_required/0
]).
--record(passwd, {user, password}).
+-include("ejabberd.hrl").
+
+-record(passwd, {us, password}).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start() ->
- mnesia:create_table(passwd,[{disc_copies, [node()]},
- {attributes, record_info(fields, passwd)}]),
+ mnesia:create_table(passwd, [{disc_copies, [node()]},
+ {attributes, record_info(fields, passwd)}]),
+ update_table(),
ok.
plain_password_required() ->
false.
-check_password(User, Password) ->
+check_password(User, Server, Password) ->
LUser = jlib:nodeprep(User),
- case catch mnesia:dirty_read({passwd, LUser}) of
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Password}] ->
true;
_ ->
false
end.
-check_password(User, Password, StreamID, Digest) ->
+check_password(User, Server, Password, StreamID, Digest) ->
LUser = jlib:nodeprep(User),
- case catch mnesia:dirty_read({passwd, LUser}) of
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Passwd}] ->
DigRes = if
Digest /= "" ->
@@ -66,26 +74,34 @@ check_password(User, Password, StreamID, Digest) ->
false
end.
-set_password(User, Password) ->
- case jlib:nodeprep(User) of
- error -> {error, invalid_jid};
- LUser ->
+set_password(User, Server, Password) ->
+ LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ if
+ (LUser == error) or (LServer == error) ->
+ {error, invalid_jid};
+ true ->
F = fun() ->
- mnesia:write(#passwd{user = LUser,
+ mnesia:write(#passwd{us = US,
password = Password})
end,
mnesia:transaction(F)
end.
-try_register(User, Password) ->
- case jlib:nodeprep(User) of
- error -> {error, invalid_jid};
- LUser ->
+try_register(User, Server, Password) ->
+ LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ if
+ (LUser == error) or (LServer == error) ->
+ {error, invalid_jid};
+ true ->
F = fun() ->
- case mnesia:read({passwd, LUser}) of
+ case mnesia:read({passwd, US}) of
[] ->
- mnesia:write(#passwd{user = LUser,
+ mnesia:write(#passwd{us = US,
password = Password}),
ok;
[_E] ->
@@ -98,27 +114,41 @@ try_register(User, Password) ->
dirty_get_registered_users() ->
mnesia:dirty_all_keys(passwd).
-get_password(User) ->
+get_vh_registered_users(Server) ->
+ LServer = jlib:nameprep(Server),
+ mnesia:dirty_select(
+ passwd,
+ [{#passwd{us = '$1', _ = '_'},
+ [{'==', {element, 2, '$1'}, LServer}],
+ ['$1']}]).
+
+get_password(User, Server) ->
LUser = jlib:nodeprep(User),
- case catch mnesia:dirty_read(passwd, LUser) of
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read(passwd, US) of
[#passwd{password = Password}] ->
Password;
_ ->
false
end.
-get_password_s(User) ->
+get_password_s(User, Server) ->
LUser = jlib:nodeprep(User),
- case catch mnesia:dirty_read(passwd, LUser) of
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read(passwd, US) of
[#passwd{password = Password}] ->
Password;
_ ->
[]
end.
-is_user_exists(User) ->
+is_user_exists(User, Server) ->
LUser = jlib:nodeprep(User),
- case catch mnesia:dirty_read({passwd, LUser}) of
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read({passwd, US}) of
[] ->
false;
[_] ->
@@ -127,20 +157,24 @@ is_user_exists(User) ->
false
end.
-remove_user(User) ->
+remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
F = fun() ->
- mnesia:delete({passwd, LUser})
+ mnesia:delete({passwd, US})
end,
mnesia:transaction(F),
- ejabberd_hooks:run(remove_user, [User]).
+ ejabberd_hooks:run(remove_user, [User, Server]).
-remove_user(User, Password) ->
+remove_user(User, Server, Password) ->
LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
F = fun() ->
- case mnesia:read({passwd, LUser}) of
+ case mnesia:read({passwd, US}) of
[#passwd{password = Password}] ->
- mnesia:delete({passwd, LUser}),
+ mnesia:delete({passwd, US}),
ok;
[_] ->
not_allowed;
@@ -150,10 +184,56 @@ remove_user(User, Password) ->
end,
case mnesia:transaction(F) of
{atomic, ok} ->
- ejabberd_hooks:run(remove_user, [User]),
+ ejabberd_hooks:run(remove_user, [User, Server]),
ok;
{atomic, Res} ->
Res;
_ ->
bad_request
end.
+
+
+update_table() ->
+ Fields = record_info(fields, passwd),
+ case mnesia:table_info(passwd, attributes) of
+ Fields ->
+ ok;
+ [user, password] ->
+ ?INFO_MSG("Converting passwd table from "
+ "{user, password} format", []),
+ Host = ?MYNAME,
+ {atomic, ok} = mnesia:create_table(
+ ejabberd_auth_internal_tmp_table,
+ [{disc_only_copies, [node()]},
+ {type, bag},
+ {local_content, true},
+ {record_name, passwd},
+ {attributes, record_info(fields, passwd)}]),
+ mnesia:transform_table(passwd, ignore, Fields),
+ F1 = fun() ->
+ mnesia:write_lock_table(ejabberd_auth_internal_tmp_table),
+ mnesia:foldl(
+ fun(#passwd{us = U} = R, _) ->
+ mnesia:dirty_write(
+ ejabberd_auth_internal_tmp_table,
+ R#passwd{us = {U, Host}})
+ end, ok, passwd)
+ end,
+ mnesia:transaction(F1),
+ mnesia:clear_table(passwd),
+ F2 = fun() ->
+ mnesia:write_lock_table(passwd),
+ mnesia:foldl(
+ fun(R, _) ->
+ mnesia:dirty_write(R)
+ end, ok, ejabberd_auth_internal_tmp_table)
+ end,
+ mnesia:transaction(F2),
+ mnesia:delete_table(ejabberd_auth_internal_tmp_table);
+ _ ->
+ ?INFO_MSG("Recreating passwd table", []),
+ mnesia:transform_table(passwd, ignore, Fields)
+ end.
+
+
+