fix: can't start dashboard if default_username is missing

This commit is contained in:
zhongwencool 2022-06-23 10:27:31 +08:00
parent 9af4cb75ef
commit 4a87d77be3
2 changed files with 15 additions and 13 deletions

View File

@ -31,6 +31,7 @@ File format:
- Fixed issue in Lua hook that didn't prevent a topic from being - Fixed issue in Lua hook that didn't prevent a topic from being
subscribed to. [#8288] subscribed to. [#8288]
- Ensuring that exhook dispatches the client events are sequential. [#8311] - Ensuring that exhook dispatches the client events are sequential. [#8311]
- Ensure start dashboard ok event if default_username is missing.
## v4.3.15 ## v4.3.15

View File

@ -206,11 +206,15 @@ is_valid_pwd(<<Salt:4/binary, Hash/binary>>, Password) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
init([]) -> init([]) ->
%% Add default admin user case binenv(default_user_username) of
{ok, _} = mnesia:subscribe({table, mqtt_admin, simple}), <<>> -> ok;
PasswordHash = ensure_default_user_in_db(binenv(default_user_username)), UserName ->
ok = ensure_default_user_passwd_hashed_in_pt(PasswordHash), %% Add default admin user
ok = maybe_warn_default_pwd(), {ok, _} = mnesia:subscribe({table, mqtt_admin, simple}),
PasswordHash = ensure_default_user_in_db(UserName),
ok = ensure_default_user_passwd_hashed_in_pt(PasswordHash),
ok = maybe_warn_default_pwd()
end,
{ok, state}. {ok, state}.
handle_call(_Req, _From, State) -> handle_call(_Req, _From, State) ->
@ -220,7 +224,7 @@ handle_cast(_Msg, State) ->
{noreply, State}. {noreply, State}.
handle_info({mnesia_table_event, {write, Admin, _}}, State) -> handle_info({mnesia_table_event, {write, Admin, _}}, State) ->
%% the password is chagned from another node, sync it to persistent_term %% the password is changed from another node, sync it to persistent_term
#mqtt_admin{username = Username, password = HashedPassword} = Admin, #mqtt_admin{username = Username, password = HashedPassword} = Admin,
case binenv(default_user_username) of case binenv(default_user_username) of
Username -> Username ->
@ -258,6 +262,7 @@ salt() ->
binenv(Key) -> binenv(Key) ->
iolist_to_binary(application:get_env(emqx_dashboard, Key, <<>>)). iolist_to_binary(application:get_env(emqx_dashboard, Key, <<>>)).
ensure_default_user_in_db(<<>>) -> <<>>;
ensure_default_user_in_db(Username) -> ensure_default_user_in_db(Username) ->
F = F =
fun() -> fun() ->
@ -279,13 +284,8 @@ ensure_default_user_in_db(Username) ->
initial_default_user_passwd_hashed() -> initial_default_user_passwd_hashed() ->
case get_default_user_passwd_hashed_from_pt() of case get_default_user_passwd_hashed_from_pt() of
Empty when ?EMPTY_KEY(Empty) -> Empty when ?EMPTY_KEY(Empty) ->
%% in case it's not set yet Pwd = binenv(default_user_passwd),
case binenv(default_user_passwd) of hash(Pwd);
Empty when ?EMPTY_KEY(Empty) ->
error({missing_configuration, default_user_passwd});
Pwd ->
hash(Pwd)
end;
PwdHash -> PwdHash ->
PwdHash PwdHash
end. end.
@ -293,6 +293,7 @@ initial_default_user_passwd_hashed() ->
%% use this persistent_term for a copy of the value in mnesia database %% use this persistent_term for a copy of the value in mnesia database
%% so that after the node leaves a cluster, db gets purged, %% so that after the node leaves a cluster, db gets purged,
%% we can still find the changed password back from PT %% we can still find the changed password back from PT
ensure_default_user_passwd_hashed_in_pt(<<>>) -> ok;
ensure_default_user_passwd_hashed_in_pt(Hashed) -> ensure_default_user_passwd_hashed_in_pt(Hashed) ->
ok = persistent_term:put({?MODULE, default_user_passwd_hashed}, Hashed). ok = persistent_term:put({?MODULE, default_user_passwd_hashed}, Hashed).