Просмотр исходного кода

fix(ldap): improve the LDAP `parse_config` function

firest 2 лет назад
Родитель
Сommit
0c33df3912

+ 1 - 13
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

+ 23 - 1
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.
 

+ 5 - 17
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) ->

+ 4 - 15
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];