From c37097a15062c53125de58c855c67e1c27e27aa6 Mon Sep 17 00:00:00 2001 From: firest Date: Thu, 25 Jan 2024 22:58:16 +0800 Subject: [PATCH 1/2] feat(dashboard): expose the `swagger_support` option --- apps/emqx_dashboard/src/emqx_dashboard.erl | 3 ++- apps/emqx_dashboard/src/emqx_dashboard_schema.erl | 6 ++++++ rel/i18n/emqx_dashboard_schema.hocon | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/emqx_dashboard/src/emqx_dashboard.erl b/apps/emqx_dashboard/src/emqx_dashboard.erl index a4438f6c7e..85647e67a0 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard.erl @@ -76,7 +76,8 @@ start_listeners(Listeners) -> security => [#{'basicAuth' => []}, #{'bearerAuth' => []}], swagger_global_spec => GlobalSpec, dispatch => dispatch(), - middlewares => [?EMQX_MIDDLE, cowboy_router, cowboy_handler] + middlewares => [?EMQX_MIDDLE, cowboy_router, cowboy_handler], + swagger_support => emqx:get_config([dashboard, swagger_support], true) }, {OkListeners, ErrListeners} = lists:foldl( diff --git a/apps/emqx_dashboard/src/emqx_dashboard_schema.erl b/apps/emqx_dashboard/src/emqx_dashboard_schema.erl index 59be9706e8..5577b47c84 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_schema.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_schema.erl @@ -56,6 +56,7 @@ fields("dashboard") -> } )}, {cors, fun cors/1}, + {swagger_support, fun swagger_support/1}, {i18n_lang, fun i18n_lang/1}, {bootstrap_users_file, ?HOCON( @@ -272,6 +273,11 @@ cors(required) -> false; cors(desc) -> ?DESC(cors); cors(_) -> undefined. +swagger_support(type) -> boolean(); +swagger_support(default) -> true; +swagger_support(desc) -> ?DESC(swagger_support); +swagger_support(_) -> undefined. + %% TODO: change it to string type %% It will be up to the dashboard package which languages to support i18n_lang(type) -> ?ENUM([en, zh]); diff --git a/rel/i18n/emqx_dashboard_schema.hocon b/rel/i18n/emqx_dashboard_schema.hocon index 524e633aa9..4ee5f32d8f 100644 --- a/rel/i18n/emqx_dashboard_schema.hocon +++ b/rel/i18n/emqx_dashboard_schema.hocon @@ -143,4 +143,9 @@ ssl_options.desc: ssl_options.label: """SSL options""" +swagger_support.desc: +"""Enable or disable support for swagger API documentation.""" + +swagger_support.label: +"""Swagger Support""" } From 13df7fa46ec8057de954c854f778b117246b33d0 Mon Sep 17 00:00:00 2001 From: firest Date: Wed, 31 Jan 2024 13:02:01 +0800 Subject: [PATCH 2/2] fix(dashboard): add test case & update change --- .../src/emqx_dashboard_listener.erl | 19 +++++++---- .../test/emqx_dashboard_SUITE.erl | 33 +++++++++++++++++++ changes/ce/feat-12398.en.md | 1 + 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 changes/ce/feat-12398.en.md diff --git a/apps/emqx_dashboard/src/emqx_dashboard_listener.erl b/apps/emqx_dashboard/src/emqx_dashboard_listener.erl index 6c4b844339..d98338d188 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_listener.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_listener.erl @@ -149,12 +149,13 @@ remove_sensitive_data(Conf0) -> post_config_update(_, {change_i18n_lang, _}, _NewConf, _OldConf, _AppEnvs) -> delay_job(regenerate); post_config_update(_, _Req, NewConf, OldConf, _AppEnvs) -> + SwaggerSupport = diff_swagger_support(NewConf, OldConf), OldHttp = get_listener(http, OldConf), OldHttps = get_listener(https, OldConf), NewHttp = get_listener(http, NewConf), NewHttps = get_listener(https, NewConf), - {StopHttp, StartHttp} = diff_listeners(http, OldHttp, NewHttp), - {StopHttps, StartHttps} = diff_listeners(https, OldHttps, NewHttps), + {StopHttp, StartHttp} = diff_listeners(http, OldHttp, NewHttp, SwaggerSupport), + {StopHttps, StartHttps} = diff_listeners(https, OldHttps, NewHttps, SwaggerSupport), Stop = maps:merge(StopHttp, StopHttps), Start = maps:merge(StartHttp, StartHttps), delay_job({update_listeners, Stop, Start}). @@ -168,10 +169,16 @@ delay_job(Msg) -> get_listener(Type, Conf) -> emqx_utils_maps:deep_get([listeners, Type], Conf, undefined). -diff_listeners(_, Listener, Listener) -> {#{}, #{}}; -diff_listeners(Type, undefined, Start) -> {#{}, #{Type => Start}}; -diff_listeners(Type, Stop, undefined) -> {#{Type => Stop}, #{}}; -diff_listeners(Type, Stop, Start) -> {#{Type => Stop}, #{Type => Start}}. +diff_swagger_support(NewConf, OldConf) -> + maps:get(swagger_support, NewConf, true) =:= + maps:get(swagger_support, OldConf, true). + +diff_listeners(_, undefined, undefined, _) -> {#{}, #{}}; +diff_listeners(_, Listener, Listener, true) -> {#{}, #{}}; +diff_listeners(Type, undefined, Start, _) -> {#{}, #{Type => Start}}; +diff_listeners(Type, Stop, undefined, _) -> {#{Type => Stop}, #{}}; +diff_listeners(Type, Listener, Listener, false) -> {#{Type => Listener}, #{Type => Listener}}; +diff_listeners(Type, Stop, Start, _) -> {#{Type => Stop}, #{Type => Start}}. -define(DIR, <<"dashboard">>). diff --git a/apps/emqx_dashboard/test/emqx_dashboard_SUITE.erl b/apps/emqx_dashboard/test/emqx_dashboard_SUITE.erl index a11b537d15..ed1925b0e2 100644 --- a/apps/emqx_dashboard/test/emqx_dashboard_SUITE.erl +++ b/apps/emqx_dashboard/test/emqx_dashboard_SUITE.erl @@ -31,6 +31,7 @@ -include_lib("eunit/include/eunit.hrl"). -include_lib("common_test/include/ct.hrl"). -include_lib("emqx/include/emqx.hrl"). +-include_lib("snabbkaffe/include/snabbkaffe.hrl"). -include("emqx_dashboard.hrl"). -define(CONTENT_TYPE, "application/x-www-form-urlencoded"). @@ -188,6 +189,38 @@ t_swagger_json(_Config) -> ), ok. +t_disable_swagger_json(_Config) -> + Url = ?HOST ++ "/api-docs/index.html", + + ?assertMatch( + {ok, {{"HTTP/1.1", 200, "OK"}, __, _}}, + httpc:request(get, {Url, []}, [], [{body_format, binary}]) + ), + + DashboardCfg = emqx:get_raw_config([dashboard]), + DashboardCfg2 = DashboardCfg#{<<"swagger_support">> => false}, + emqx:update_config([dashboard], DashboardCfg2), + ?retry( + _Sleep = 1000, + _Attempts = 5, + ?assertMatch( + {ok, {{"HTTP/1.1", 404, "Not Found"}, _, _}}, + httpc:request(get, {Url, []}, [], [{body_format, binary}]) + ) + ), + + DashboardCfg3 = DashboardCfg#{<<"swagger_support">> => true}, + emqx:update_config([dashboard], DashboardCfg3), + ?retry( + _Sleep0 = 1000, + _Attempts0 = 5, + ?assertMatch( + {ok, {{"HTTP/1.1", 200, "OK"}, __, _}}, + httpc:request(get, {Url, []}, [], [{body_format, binary}]) + ) + ), + ok. + t_cli(_Config) -> [mria:dirty_delete(?ADMIN, Admin) || Admin <- mnesia:dirty_all_keys(?ADMIN)], emqx_dashboard_cli:admins(["add", "username", "password_ww2"]), diff --git a/changes/ce/feat-12398.en.md b/changes/ce/feat-12398.en.md new file mode 100644 index 0000000000..71f88c138e --- /dev/null +++ b/changes/ce/feat-12398.en.md @@ -0,0 +1 @@ +Exposed the `swagger_support` option in configuration for Dashboard to disable the swagger API document.