From c17c7884380313d1b2075da90fa9ec1cada9dc48 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Thu, 6 Jun 2024 16:27:22 +0200 Subject: [PATCH 1/3] feat(connector): allow delegate `pre_config_update` to impls --- apps/emqx_connector/src/emqx_connector.erl | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/emqx_connector/src/emqx_connector.erl b/apps/emqx_connector/src/emqx_connector.erl index 159e05f9b..bf37200db 100644 --- a/apps/emqx_connector/src/emqx_connector.erl +++ b/apps/emqx_connector/src/emqx_connector.erl @@ -126,19 +126,28 @@ pre_config_update([?ROOT_KEY, _Type, _Name], Oper, OldConfig) when -> %% to save the 'enable' to the config files {ok, OldConfig#{<<"enable">> => operation_to_enable(Oper)}}; -pre_config_update([?ROOT_KEY, _Type, Name] = Path, Conf = #{}, _OldConfig) -> +pre_config_update([?ROOT_KEY, _Type, Name] = Path, Conf = #{}, ConfOld) -> case validate_connector_name(Name) of ok -> case emqx_connector_ssl:convert_certs(filename:join(Path), Conf) of - {error, Reason} -> - {error, Reason}; {ok, ConfNew} -> - {ok, ConfNew} + connector_pre_config_update(Path, ConfNew, ConfOld); + {error, Reason} -> + {error, Reason} end; Error -> Error end. +connector_pre_config_update([?ROOT_KEY, Type, Name] = Path, ConfNew, ConfOld) -> + Mod = emqx_connector_info:config_transform_module(Type), + case Mod =/= undefined andalso erlang:function_exported(Mod, pre_config_update, 4) of + true -> + apply(Mod, pre_config_update, [Path, Name, ConfNew, ConfOld]); + false -> + {ok, ConfNew} + end. + operation_to_enable(disable) -> false; operation_to_enable(enable) -> true. From 8a85d7cb5ab586c74b59a161587bbb8edc7c46b5 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Thu, 6 Jun 2024 16:28:25 +0200 Subject: [PATCH 2/3] fix(bridge-s3): pass SSL options through `convert_certs/2` --- apps/emqx_bridge_s3/src/emqx_bridge_s3.app.src | 2 +- apps/emqx_bridge_s3/src/emqx_bridge_s3.erl | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/emqx_bridge_s3/src/emqx_bridge_s3.app.src b/apps/emqx_bridge_s3/src/emqx_bridge_s3.app.src index 01a3e6c7c..eea4ff89e 100644 --- a/apps/emqx_bridge_s3/src/emqx_bridge_s3.app.src +++ b/apps/emqx_bridge_s3/src/emqx_bridge_s3.app.src @@ -1,6 +1,6 @@ {application, emqx_bridge_s3, [ {description, "EMQX Enterprise S3 Bridge"}, - {vsn, "0.1.1"}, + {vsn, "0.1.2"}, {registered, []}, {applications, [ kernel, diff --git a/apps/emqx_bridge_s3/src/emqx_bridge_s3.erl b/apps/emqx_bridge_s3/src/emqx_bridge_s3.erl index 49f033554..e18d79786 100644 --- a/apps/emqx_bridge_s3/src/emqx_bridge_s3.erl +++ b/apps/emqx_bridge_s3/src/emqx_bridge_s3.erl @@ -22,6 +22,10 @@ connector_examples/1 ]). +-export([ + pre_config_update/4 +]). + %%------------------------------------------------------------------------------------------------- %% `hocon_schema' API %%------------------------------------------------------------------------------------------------- @@ -110,3 +114,15 @@ connector_example(put) -> enable_pipelining => 1 } }. + +%% Config update + +pre_config_update(Path, _Name, Conf = #{<<"transport_options">> := TransportOpts}, _ConfOld) -> + case emqx_connector_ssl:convert_certs(filename:join(Path), TransportOpts) of + {ok, NTransportOpts} -> + {ok, Conf#{<<"transport_options">> := NTransportOpts}}; + {error, {bad_ssl_config, Error}} -> + {error, Error#{reason => <<"bad_ssl_config">>}} + end; +pre_config_update(_Path, _Name, Conf, _ConfOld) -> + {ok, Conf}. From 5672326ca805669e3a8095b85daa968570e02440 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Thu, 6 Jun 2024 16:34:30 +0200 Subject: [PATCH 3/3] chore: add changelog entry --- changes/ee/fix-13197.en.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/ee/fix-13197.en.md diff --git a/changes/ee/fix-13197.en.md b/changes/ee/fix-13197.en.md new file mode 100644 index 000000000..069879aee --- /dev/null +++ b/changes/ee/fix-13197.en.md @@ -0,0 +1 @@ +Fixed an issue with S3 Bridge that prevented automatic saving of TLS certificates and key files to the file system, when they are supplied through the Dashboard UI or Connector API.