diff options
Diffstat (limited to 'src/ejabberd_auth_internal.erl')
-rw-r--r-- | src/ejabberd_auth_internal.erl | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/ejabberd_auth_internal.erl b/src/ejabberd_auth_internal.erl new file mode 100644 index 00000000..b502eaf9 --- /dev/null +++ b/src/ejabberd_auth_internal.erl @@ -0,0 +1,167 @@ +%%%---------------------------------------------------------------------- +%%% File : ejabberd_auth_internal.erl +%%% Author : Alexey Shchepin <alexey@sevcom.net> +%%% Purpose : Authentification via mnesia +%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@sevcom.net> +%%% Id : $Id$ +%%%---------------------------------------------------------------------- + +-module(ejabberd_auth_internal). +-author('alexey@sevcom.net'). +-vsn('$Revision$ '). + +%% External exports +-export([start/0, + set_password/2, + check_password/2, + check_password/4, + try_register/2, + dirty_get_registered_users/0, + get_password/1, + get_password_s/1, + is_user_exists/1, + remove_user/1, + remove_user/2, + plain_password_required/0 + ]). + +-record(passwd, {user, password}). + +%%%---------------------------------------------------------------------- +%%% API +%%%---------------------------------------------------------------------- +start() -> + mnesia:create_table(passwd,[{disc_copies, [node()]}, + {attributes, record_info(fields, passwd)}]), + ok. + +plain_password_required() -> + false. + +check_password(User, Password) -> + LUser = jlib:nodeprep(User), + case catch mnesia:dirty_read({passwd, LUser}) of + [#passwd{password = Password}] -> + true; + _ -> + false + end. + +check_password(User, Password, StreamID, Digest) -> + LUser = jlib:nodeprep(User), + case catch mnesia:dirty_read({passwd, LUser}) of + [#passwd{password = Passwd}] -> + DigRes = if + Digest /= "" -> + Digest == sha:sha(StreamID ++ Passwd); + true -> + false + end, + if DigRes -> + true; + true -> + (Passwd == Password) and (Password /= "") + end; + _ -> + false + end. + +set_password(User, Password) -> + case jlib:nodeprep(User) of + error -> {error, invalid_jid}; + LUser -> + F = fun() -> + mnesia:write(#passwd{user = LUser, + password = Password}) + end, + mnesia:transaction(F) + end. + + +try_register(User, Password) -> + case jlib:nodeprep(User) of + error -> {error, invalid_jid}; + LUser -> + F = fun() -> + case mnesia:read({passwd, LUser}) of + [] -> + mnesia:write(#passwd{user = LUser, + password = Password}), + ok; + [_E] -> + exists + end + end, + mnesia:transaction(F) + end. + +dirty_get_registered_users() -> + mnesia:dirty_all_keys(passwd). + +get_password(User) -> + LUser = jlib:nodeprep(User), + case catch mnesia:dirty_read(passwd, LUser) of + [#passwd{password = Password}] -> + Password; + _ -> + false + end. + +get_password_s(User) -> + LUser = jlib:nodeprep(User), + case catch mnesia:dirty_read(passwd, LUser) of + [#passwd{password = Password}] -> + Password; + _ -> + [] + end. + +is_user_exists(User) -> + LUser = jlib:nodeprep(User), + case catch mnesia:dirty_read({passwd, LUser}) of + [] -> + false; + [_] -> + true; + _ -> + false + end. + +remove_user(User) -> + LUser = jlib:nodeprep(User), + F = fun() -> + mnesia:delete({passwd, LUser}) + end, + mnesia:transaction(F), + catch mod_roster:remove_user(User), + catch mod_offline:remove_user(User), + catch mod_last:remove_user(User), + catch mod_vcard:remove_user(User), + catch mod_private:remove_user(User). + +remove_user(User, Password) -> + LUser = jlib:nodeprep(User), + F = fun() -> + case mnesia:read({passwd, LUser}) of + [#passwd{password = Password}] -> + mnesia:delete({passwd, LUser}), + ok; + [_] -> + not_allowed; + _ -> + not_exists + end + end, + case mnesia:transaction(F) of + {atomic, ok} -> + catch mod_roster:remove_user(User), + catch mod_offline:remove_user(User), + catch mod_last:remove_user(User), + catch mod_vcard:remove_user(User), + catch mod_private:remove_user(User), + ok; + {atomic, Res} -> + Res; + _ -> + bad_request + end. |