|
|
@@ -272,22 +272,59 @@ user(put, #{bindings := #{username := Username}, body := Params}) ->
|
|
|
{error, Reason} ->
|
|
|
{404, ?USER_NOT_FOUND, Reason}
|
|
|
end;
|
|
|
-user(delete, #{bindings := #{username := Username}}) ->
|
|
|
+user(delete, #{bindings := #{username := Username}, headers := Headers}) ->
|
|
|
case Username == emqx_dashboard_admin:default_username() of
|
|
|
true ->
|
|
|
?SLOG(info, #{msg => "Dashboard delete admin user failed", username => Username}),
|
|
|
Message = list_to_binary(io_lib:format("Cannot delete user ~p", [Username])),
|
|
|
{400, ?NOT_ALLOWED, Message};
|
|
|
false ->
|
|
|
- case emqx_dashboard_admin:remove_user(Username) of
|
|
|
- {error, Reason} ->
|
|
|
- {404, ?USER_NOT_FOUND, Reason};
|
|
|
- {ok, _} ->
|
|
|
- ?SLOG(info, #{msg => "Dashboard delete admin user", username => Username}),
|
|
|
- {204}
|
|
|
+ case is_self_auth(Username, Headers) of
|
|
|
+ true ->
|
|
|
+ {400, ?NOT_ALLOWED, <<"Cannot delete self">>};
|
|
|
+ false ->
|
|
|
+ case emqx_dashboard_admin:remove_user(Username) of
|
|
|
+ {error, Reason} ->
|
|
|
+ {404, ?USER_NOT_FOUND, Reason};
|
|
|
+ {ok, _} ->
|
|
|
+ ?SLOG(info, #{
|
|
|
+ msg => "Dashboard delete admin user", username => Username
|
|
|
+ }),
|
|
|
+ {204}
|
|
|
+ end
|
|
|
end
|
|
|
end.
|
|
|
|
|
|
+is_self_auth(Username, #{<<"authorization">> := Token}) ->
|
|
|
+ is_self_auth(Username, Token);
|
|
|
+is_self_auth(Username, #{<<"Authorization">> := Token}) ->
|
|
|
+ is_self_auth(Username, Token);
|
|
|
+is_self_auth(Username, <<"basic ", Token/binary>>) ->
|
|
|
+ is_self_auth_basic(Username, Token);
|
|
|
+is_self_auth(Username, <<"Basic ", Token/binary>>) ->
|
|
|
+ is_self_auth_basic(Username, Token);
|
|
|
+is_self_auth(Username, <<"bearer ", Token/binary>>) ->
|
|
|
+ is_self_auth_token(Username, Token);
|
|
|
+is_self_auth(Username, <<"Bearer ", Token/binary>>) ->
|
|
|
+ is_self_auth_token(Username, Token).
|
|
|
+
|
|
|
+is_self_auth_basic(Username, Token) ->
|
|
|
+ UP = base64:decode(Token),
|
|
|
+ case binary:match(UP, Username) of
|
|
|
+ {0, N} ->
|
|
|
+ binary:part(UP, {N, 1}) == <<":">>;
|
|
|
+ _ ->
|
|
|
+ false
|
|
|
+ end.
|
|
|
+
|
|
|
+is_self_auth_token(Username, Token) ->
|
|
|
+ case emqx_dashboard_token:owner(Token) of
|
|
|
+ {ok, Owner} ->
|
|
|
+ Owner == Username;
|
|
|
+ {error, _NotFound} ->
|
|
|
+ false
|
|
|
+ end.
|
|
|
+
|
|
|
change_pwd(put, #{bindings := #{username := Username}, body := Params}) ->
|
|
|
LogMeta = #{msg => "Dashboard change password", username => Username},
|
|
|
OldPwd = maps:get(<<"old_pwd">>, Params),
|