chore: fix 500 crashes when backend not existed

This commit is contained in:
JianBo He 2023-09-22 11:28:16 +08:00 committed by JimMoen
parent b4fb5196cb
commit 1c78c6bf6d
No known key found for this signature in database
GPG Key ID: 87A520B4F76BA86D
2 changed files with 25 additions and 15 deletions

View File

@ -173,8 +173,10 @@ schema("/sso/saml/metadata") ->
fields(backend_status) -> fields(backend_status) ->
emqx_dashboard_sso_schema:common_backend_schema(emqx_dashboard_sso:types()). emqx_dashboard_sso_schema:common_backend_schema(emqx_dashboard_sso:types()).
%% ------------------------------------------------------------------------------------------------- %%--------------------------------------------------------------------
%% API %% API
%%--------------------------------------------------------------------
running(get, _Request) -> running(get, _Request) ->
SSO = emqx:get_config([dashboard_sso], #{}), SSO = emqx:get_config([dashboard_sso], #{}),
{200, {200,
@ -191,7 +193,7 @@ running(get, _Request) ->
login(post, #{bindings := #{backend := Backend}, body := Sign, headers := Headers}) -> login(post, #{bindings := #{backend := Backend}, body := Sign, headers := Headers}) ->
case emqx_dashboard_sso_manager:lookup_state(Backend) of case emqx_dashboard_sso_manager:lookup_state(Backend) of
undefined -> undefined ->
{404, ?BACKEND_NOT_FOUND, <<"Backend not found">>}; {404, #{code => ?BACKEND_NOT_FOUND, message => <<"Backend not found">>}};
State -> State ->
Provider = provider(Backend), Provider = provider(Backend),
case emqx_dashboard_sso:login(Provider, Sign, State) of case emqx_dashboard_sso:login(Provider, Sign, State) of
@ -207,7 +209,7 @@ login(post, #{bindings := #{backend := Backend}, body := Sign, headers := Header
request => Sign, request => Sign,
reason => Reason reason => Reason
}), }),
{401, ?BAD_USERNAME_OR_PWD, <<"Auth failed">>} {401, #{code => ?BAD_USERNAME_OR_PWD, message => <<"Auth failed">>}}
end end
end. end.
@ -224,7 +226,7 @@ sso(get, _Request) ->
backend(get, #{bindings := #{backend := Type}}) -> backend(get, #{bindings := #{backend := Type}}) ->
case emqx:get_config([dashboard_sso, Type], undefined) of case emqx:get_config([dashboard_sso, Type], undefined) of
undefined -> undefined ->
{404, ?BACKEND_NOT_FOUND}; {404, #{code => ?BACKEND_NOT_FOUND, message => <<"Backend not found">>}};
Backend -> Backend ->
{200, to_json(Backend)} {200, to_json(Backend)}
end; end;
@ -238,7 +240,7 @@ backend(delete, #{bindings := #{backend := Backend}}) ->
sp_saml_metadata(get, _Req) -> sp_saml_metadata(get, _Req) ->
case emqx_dashboard_sso_manager:lookup_state(saml) of case emqx_dashboard_sso_manager:lookup_state(saml) of
undefined -> undefined ->
{404, ?BACKEND_NOT_FOUND, <<"Backend not found">>}; {404, #{code => ?BACKEND_NOT_FOUND, message => <<"Backend not found">>}};
#{sp := SP} = _State -> #{sp := SP} = _State ->
SignedXml = esaml_sp:generate_metadata(SP), SignedXml = esaml_sp:generate_metadata(SP),
Metadata = xmerl:export([SignedXml], xmerl_xml), Metadata = xmerl:export([SignedXml], xmerl_xml),
@ -248,7 +250,7 @@ sp_saml_metadata(get, _Req) ->
sp_saml_callback(post, Req) -> sp_saml_callback(post, Req) ->
case emqx_dashboard_sso_manager:lookup_state(saml) of case emqx_dashboard_sso_manager:lookup_state(saml) of
undefined -> undefined ->
{404, ?BACKEND_NOT_FOUND, <<"Backend not found">>}; {404, #{code => ?BACKEND_NOT_FOUND, message => <<"Backend not found">>}};
State -> State ->
case (provider(saml)):callback(Req, State) of case (provider(saml)):callback(Req, State) of
{ok, Token} -> {ok, Token} ->
@ -266,8 +268,10 @@ sp_saml_callback(post, Req) ->
sso_parameters(Params) -> sso_parameters(Params) ->
backend_name_as_arg(query, [local], <<"local">>) ++ Params. backend_name_as_arg(query, [local], <<"local">>) ++ Params.
%% ------------------------------------------------------------------------------------------------- %%--------------------------------------------------------------------
%% internal %% internal
%%--------------------------------------------------------------------
response_schema(302) -> response_schema(302) ->
emqx_dashboard_swagger:error_codes([?REDIRECT], ?DESC(redirect)); emqx_dashboard_swagger:error_codes([?REDIRECT], ?DESC(redirect));
response_schema(401) -> response_schema(401) ->
@ -324,11 +328,13 @@ handle_backend_update_result({ok, _}, Config) ->
handle_backend_update_result(ok, _) -> handle_backend_update_result(ok, _) ->
204; 204;
handle_backend_update_result({error, not_exists}, _) -> handle_backend_update_result({error, not_exists}, _) ->
{404, ?BACKEND_NOT_FOUND, <<"Backend not found">>}; {404, #{code => ?BACKEND_NOT_FOUND, message => <<"Backend not found">>}};
handle_backend_update_result({error, already_exists}, _) -> handle_backend_update_result({error, already_exists}, _) ->
{400, ?BAD_REQUEST, <<"Backend already exists">>}; {400, #{code => ?BAD_REQUEST, message => <<"Backend already exists">>}};
handle_backend_update_result({error, failed_to_load_metadata}, _) ->
{400, #{code => ?BAD_REQUEST, message => <<"Failed to load metadata">>}};
handle_backend_update_result({error, Reason}, _) -> handle_backend_update_result({error, Reason}, _) ->
{400, ?BAD_REQUEST, Reason}. {400, #{code => ?BAD_REQUEST, message => Reason}}.
to_json(Data) -> to_json(Data) ->
emqx_utils_maps:jsonable_map( emqx_utils_maps:jsonable_map(

View File

@ -117,15 +117,19 @@ create(
email = "contact@emqx.io" email = "contact@emqx.io"
} }
}), }),
try
IdpMeta = esaml_util:load_metadata(binary_to_list(IDPMetadataURL)), IdpMeta = esaml_util:load_metadata(binary_to_list(IDPMetadataURL)),
{ok, Config#{idp_meta => IdpMeta, sp => SP}}
{ok, Config#{idp_meta => IdpMeta, sp => SP}}. catch
Kind:Error ->
?SLOG(error, #{msg => failed_to_load_metadata, kind => Kind, error => Error}),
{error, failed_to_load_metadata}
end.
update(_Config0, State) -> update(_Config0, State) ->
{ok, State}. {ok, State}.
destroy(#{resource_id := ResourceId}) -> destroy(_State) ->
_ = emqx_resource:remove_local(ResourceId),
ok. ok.
login(_Req, #{sp := SP, idp_meta := #esaml_idp_metadata{login_location = IDP}} = _State) -> login(_Req, #{sp := SP, idp_meta := #esaml_idp_metadata{login_location = IDP}} = _State) ->