fix(sso): fix invalid_dynamic_call

This commit is contained in:
firest 2023-09-19 22:47:48 +08:00
parent 285e529766
commit 5b00998050
4 changed files with 44 additions and 11 deletions

View File

@ -6,7 +6,17 @@
-include_lib("hocon/include/hoconsc.hrl").
-export([
hocon_ref/1,
login_ref/1,
create/2,
update/3,
destroy/2,
login/3
]).
-export([types/0, modules/0, provider/1, backends/0]).
%%------------------------------------------------------------------------------
%% Callbacks
%%------------------------------------------------------------------------------
@ -18,9 +28,10 @@
-type state() :: #{atom() => term()}.
-type raw_config() :: #{binary() => term()}.
-type config() :: parsed_config() | raw_config().
-type hocon_ref() :: ?R_REF(Module :: atom(), Name :: atom() | binary()).
-callback hocon_ref() -> ?R_REF(Module :: atom(), Name :: atom() | binary()).
-callback login_ref() -> ?R_REF(Module :: atom(), Name :: atom() | binary()).
-callback hocon_ref() -> hocon_ref().
-callback login_ref() -> hocon_ref().
-callback create(Config :: config()) ->
{ok, State :: state()} | {error, Reason :: term()}.
-callback update(Config :: config(), State :: state()) ->
@ -29,6 +40,29 @@
-callback login(request(), State :: state()) ->
{ok, Token :: binary()} | {error, Reason :: term()}.
%%------------------------------------------------------------------------------
%% Callback Interface
%%------------------------------------------------------------------------------
-spec hocon_ref(Mod :: module()) -> hocon_ref().
hocon_ref(Mod) ->
Mod:hocon_ref().
-spec login_ref(Mod :: module()) -> hocon_ref().
login_ref(Mod) ->
Mod:login_ref().
create(Mod, Config) ->
Mod:create(Config).
update(Mod, Config, State) ->
Mod:update(Config, State).
destroy(Mod, State) ->
Mod:destroy(State).
login(Mod, Req, State) ->
Mod:login(Req, State).
%%------------------------------------------------------------------------------
%% API
%%------------------------------------------------------------------------------

View File

@ -36,7 +36,6 @@
-define(BAD_USERNAME_OR_PWD, 'BAD_USERNAME_OR_PWD').
-define(BAD_REQUEST, 'BAD_REQUEST').
-define(BACKEND_NOT_FOUND, 'BACKEND_NOT_FOUND').
-define(TAGS, <<"Dashboard Single Sign-on">>).
@ -122,7 +121,7 @@ login(post, #{bindings := #{backend := Backend}, body := Sign}) ->
{404, ?BACKEND_NOT_FOUND, <<"Backend not found">>};
State ->
Provider = emqx_dashboard_sso:provider(Backend),
case Provider:login(Sign, State) of
case emqx_dashboard_sso:login(Provider, Sign, State) of
{ok, Token} ->
?SLOG(info, #{msg => "Dashboard SSO login successfully", request => Sign}),
Version = iolist_to_binary(proplists:get_value(version, emqx_sys:info())),
@ -174,10 +173,10 @@ response_schema(404) ->
emqx_dashboard_swagger:error_codes([?BACKEND_NOT_FOUND], ?DESC(backend_not_found)).
backend_union() ->
hoconsc:union([Mod:hocon_ref() || Mod <- emqx_dashboard_sso:modules()]).
hoconsc:union([emqx_dashboard_sso:hocon_ref(Mod) || Mod <- emqx_dashboard_sso:modules()]).
login_union() ->
hoconsc:union([Mod:login_ref() || Mod <- emqx_dashboard_sso:modules()]).
hoconsc:union([emqx_dashboard_sso:login_ref(Mod) || Mod <- emqx_dashboard_sso:modules()]).
backend_name_in_path() ->
backend_name_as_arg(path, [], <<"ldap">>).

View File

@ -157,7 +157,7 @@ start_backend_services() ->
fun({Backend, Config}) ->
Provider = provider(Backend),
on_backend_updated(
Provider:create(Config),
emqx_dashboard_sso:create(Provider, Config),
fun(State) ->
ets:insert(dashboard_sso, #dashboard_sso{backend = Backend, state = State})
end
@ -197,14 +197,14 @@ on_config_update({update, Backend, _Config}, NewConf, _OldConf) ->
case lookup(Backend) of
undefined ->
on_backend_updated(
Provider:create(Config),
emqx_dashboard_sso:create(Provider, Config),
fun(State) ->
ets:insert(dashboard_sso, #dashboard_sso{backend = Backend, state = State})
end
);
Data ->
on_backend_updated(
Provider:update(Config, Data#dashboard_sso.state),
emqx_dashboard_sso:update(Provider, Config, Data#dashboard_sso.state),
fun(State) ->
ets:insert(dashboard_sso, Data#dashboard_sso{state = State})
end
@ -217,7 +217,7 @@ on_config_update({delete, Backend}, _NewConf, _OldConf) ->
Data ->
Provider = provider(Backend),
on_backend_updated(
Provider:destroy(Data#dashboard_sso.state),
emqx_dashboard_sso:destroy(Provider, Data#dashboard_sso.state),
fun() ->
ets:delete(dashboard_sso, Backend)
end

View File

@ -29,7 +29,7 @@ roots() -> [dashboard_sso].
fields(dashboard_sso) ->
lists:map(
fun({Type, Module}) ->
{Type, mk(Module:hocon_ref(), #{required => {false, recursively}})}
{Type, mk(emqx_dashboard_sso:hocon_ref(Module), #{required => {false, recursively}})}
end,
maps:to_list(emqx_dashboard_sso:backends())
).