+2008-08-18 Badlop <badlop@process-one.net>
+
+ * src/mod_register.erl: Change password using mod_register always
+ returns success regardless of real result (EJAB-723)
+ * src/ejabberd_auth.erl: Likewise
+ * src/ejabberd_auth_external.erl: Likewise
+ * src/ejabberd_auth_internal.erl: Likewise
+ * src/ejabberd_auth_odbc.erl: Likewise
+
2008-08-16 Badlop <badlop@process-one.net>
* src/msgs/sv.msg: Fixed formatting typos
[AuthMod | _] -> {true, AuthMod}
end.
+%% @spec (User::string(), Server::string(), Password::string()) ->
+%% ok | {error, ErrorType}
+%% where ErrorType = empty_password | not_allowed | invalid_jid
+set_password(_User, _Server, "") ->
+ %% We do not allow empty password
+ {error, empty_password};
set_password(User, Server, Password) ->
lists:foldl(
fun(M, {error, _}) ->
Res
end, {error, not_allowed}, auth_modules(Server)).
+try_register(_User, _Server, "") ->
+ %% We do not allow empty password
+ {error, not_allowed};
try_register(User, Server, Password) ->
case is_user_exists(User,Server) of
true ->
check_password(User, Server, Password).
set_password(User, Server, Password) ->
- extauth:set_password(User, Server, Password).
+ case extauth:set_password(User, Server, Password) of
+ true -> ok;
+ _ -> {error, unknown_problem}
+ end.
try_register(_User, _Server, _Password) ->
{error, not_allowed}.
false
end.
+%% @spec (User::string(), Server::string(), Password::string()) ->
+%% ok | {error, invalid_jid}
set_password(User, Server, Password) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
mnesia:write(#passwd{us = US,
password = Password})
end,
- mnesia:transaction(F)
+ {atomic, ok} = mnesia:transaction(F),
+ ok
end.
end
end.
+%% @spec (User::string(), Server::string(), Password::string()) ->
+%% ok | {error, invalid_jid}
set_password(User, Server, Password) ->
case jlib:nodeprep(User) of
error ->
Username = ejabberd_odbc:escape(LUser),
Pass = ejabberd_odbc:escape(Password),
LServer = jlib:nameprep(Server),
- catch odbc_queries:set_password_t(LServer, Username, Pass)
+ case catch odbc_queries:set_password_t(LServer, Username, Pass) of
+ {atomic, ok} -> ok;
+ Other -> {error, Other}
+ end
end.
Password = xml:get_tag_cdata(PTag),
case From of
#jid{user = User, lserver = Server} ->
- ejabberd_auth:set_password(User, Server, Password),
- IQ#iq{type = result, sub_el = [SubEl]};
+ try_set_password(User, Server, Password, IQ, SubEl);
_ ->
case try_register(User, Server, Password,
Source, Lang) of
{xmlelement, "password", [], []}]}]}
end.
+%% @doc Try to change password and return IQ response
+try_set_password(User, Server, Password, IQ, SubEl) ->
+ case ejabberd_auth:set_password(User, Server, Password) of
+ ok ->
+ IQ#iq{type = result, sub_el = [SubEl]};
+ {error, empty_password} ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_BAD_REQUEST]};
+ {error, not_allowed} ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ {error, invalid_jid} ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]};
+ _ ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
+ end.
try_register(User, Server, Password, Source, Lang) ->
case jlib:is_nodename(User) of