chore: fix 500 crashes when backend not existed
This commit is contained in:
parent
b4fb5196cb
commit
1c78c6bf6d
|
@ -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(
|
||||||
|
|
|
@ -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) ->
|
||||||
|
|
Loading…
Reference in New Issue