From 5b009980501c8753e6b2a36c0004a051128e2b51 Mon Sep 17 00:00:00 2001 From: firest Date: Tue, 19 Sep 2023 22:47:48 +0800 Subject: [PATCH] fix(sso): fix invalid_dynamic_call --- .../src/emqx_dashboard_sso.erl | 38 ++++++++++++++++++- .../src/emqx_dashboard_sso_api.erl | 7 ++-- .../src/emqx_dashboard_sso_manager.erl | 8 ++-- .../src/emqx_dashboard_sso_schema.erl | 2 +- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso.erl index 287082414..8fbf220f5 100644 --- a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso.erl +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso.erl @@ -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 %%------------------------------------------------------------------------------ diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_api.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_api.erl index dd473931c..2f1c19d29 100644 --- a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_api.erl +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_api.erl @@ -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">>). diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_manager.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_manager.erl index a087af615..6097a39ff 100644 --- a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_manager.erl +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_manager.erl @@ -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 diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_schema.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_schema.erl index 19b0473fd..b45bca8e5 100644 --- a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_schema.erl +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_schema.erl @@ -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()) ).