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

View File

@ -117,15 +117,19 @@ create(
email = "contact@emqx.io"
}
}),
try
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) ->
{ok, State}.
destroy(#{resource_id := ResourceId}) ->
_ = emqx_resource:remove_local(ResourceId),
destroy(_State) ->
ok.
login(_Req, #{sp := SP, idp_meta := #esaml_idp_metadata{login_location = IDP}} = _State) ->