diff --git a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_ldap.erl b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_ldap.erl index bea8ef7c6..dff3b2d31 100644 --- a/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_ldap.erl +++ b/apps/emqx_dashboard_sso/src/emqx_dashboard_sso_ldap.erl @@ -86,19 +86,7 @@ destroy(#{resource_id := ResourceId}) -> parse_config(Config0) -> Config = ensure_bind_password(Config0), - State = lists:foldl( - fun(Key, Acc) -> - case maps:find(Key, Config) of - {ok, Value} when is_binary(Value) -> - Acc#{Key := erlang:binary_to_list(Value)}; - _ -> - Acc - end - end, - Config, - [query_timeout] - ), - {Config, State}. + {Config, emqx_ldap:parse_config(Config, [query_timeout], [])}. %% In this feature, the `bind_password` is fixed, so it should conceal from the swagger, %% but the connector still needs it, hence we should add it back here diff --git a/apps/emqx_ldap/src/emqx_ldap.erl b/apps/emqx_ldap/src/emqx_ldap.erl index 7b856521c..20e6550df 100644 --- a/apps/emqx_ldap/src/emqx_ldap.erl +++ b/apps/emqx_ldap/src/emqx_ldap.erl @@ -27,7 +27,7 @@ -export([roots/0, fields/1, desc/1]). --export([do_get_status/1]). +-export([do_get_status/1, parse_config/3]). -define(LDAP_HOST_OPTIONS, #{ default_port => 389 @@ -114,6 +114,28 @@ ensure_username(required) -> ensure_username(Field) -> ?ECS:username(Field). +parse_config(Config, ToKeep, ToString) -> + Convert = fun(Value) -> + case lists:member(Value, ToString) of + true -> + erlang:binary_to_list(Value); + _ -> + Value + end + end, + lists:foldl( + fun(Key, Acc) -> + case maps:find(Key, Config) of + {ok, Value} -> + Acc#{Key => Convert(Value)}; + _ -> + Acc + end + end, + #{}, + ToKeep ++ ToString + ). + %% =================================================================== callback_mode() -> always_sync. diff --git a/apps/emqx_ldap/src/emqx_ldap_authn.erl b/apps/emqx_ldap/src/emqx_ldap_authn.erl index d5f2658bb..8f60d57b3 100644 --- a/apps/emqx_ldap/src/emqx_ldap_authn.erl +++ b/apps/emqx_ldap/src/emqx_ldap_authn.erl @@ -91,14 +91,14 @@ refs() -> create(_AuthenticatorID, Config) -> do_create(?MODULE, Config). -do_create(Module, Config0) -> +do_create(Module, Config) -> ResourceId = emqx_authn_utils:make_resource_id(Module), - {Config, State} = parse_config(Config0), + State = parse_config(Config), {ok, _Data} = emqx_authn_utils:create_resource(ResourceId, emqx_ldap, Config), {ok, State#{resource_id => ResourceId}}. -update(Config0, #{resource_id := ResourceId} = _State) -> - {Config, NState} = parse_config(Config0), +update(Config, #{resource_id := ResourceId} = _State) -> + NState = parse_config(Config), case emqx_authn_utils:update_resource(emqx_ldap, Config, ResourceId) of {error, Reason} -> error({load_config_error, Reason}); @@ -143,19 +143,7 @@ authenticate( end. parse_config(Config) -> - State = lists:foldl( - fun(Key, Acc) -> - case maps:find(Key, Config) of - {ok, Value} when is_binary(Value) -> - Acc#{Key := erlang:binary_to_list(Value)}; - _ -> - Acc - end - end, - Config, - [password_attribute, is_superuser_attribute, query_timeout] - ), - {Config, State}. + emqx_ldap:parse_config(Config, [query_timeout], [password_attribute, is_superuser_attribute]). %% To compatible v4.x is_enabled(Password, #eldap_entry{attributes = Attributes} = Entry, State) -> diff --git a/apps/emqx_ldap/src/emqx_ldap_authz.erl b/apps/emqx_ldap/src/emqx_ldap_authz.erl index 13110306c..7a714b87e 100644 --- a/apps/emqx_ldap/src/emqx_ldap_authz.erl +++ b/apps/emqx_ldap/src/emqx_ldap_authz.erl @@ -134,21 +134,10 @@ do_authorize(_Action, _Topic, [], _Entry) -> nomatch. new_annotations(Init, Source) -> - lists:foldl( - fun(Attr, Acc) -> - Acc#{ - Attr => - case maps:get(Attr, Source) of - Value when is_binary(Value) -> - erlang:binary_to_list(Value); - Value -> - Value - end - } - end, - Init, - [publish_attribute, subscribe_attribute, all_attribute] - ). + State = emqx_ldap:parse_config(Source, [query_timeout], [ + publish_attribute, subscribe_attribute, all_attribute + ]), + maps:merge(Init, State). select_attrs(#{action_type := publish}, #{publish_attribute := Pub, all_attribute := All}) -> [Pub, All];