From 6085442958dc5bbeaff9918e6b5e798277bc6bd8 Mon Sep 17 00:00:00 2001 From: firest Date: Thu, 24 Aug 2023 15:35:21 +0800 Subject: [PATCH] fix(ldap): expose request_timeout to prevent infinite hang --- apps/emqx_ldap/src/emqx_ldap.erl | 16 +++++++++++++--- rel/i18n/emqx_ldap.hocon | 6 ++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/emqx_ldap/src/emqx_ldap.erl b/apps/emqx_ldap/src/emqx_ldap.erl index 73a0a363c..d14ddf97d 100644 --- a/apps/emqx_ldap/src/emqx_ldap.erl +++ b/apps/emqx_ldap/src/emqx_ldap.erl @@ -70,7 +70,12 @@ fields(config) -> example => <<"(& (objectClass=mqttUser) (uid=${username}))">>, validator => fun emqx_schema:non_empty_string/1 } - )} + )}, + {request_timeout, + ?HOCON(emqx_schema:timeout_duration_ms(), #{ + desc => ?DESC(request_timeout), + default => <<"5s">> + })} ] ++ emqx_connector_schema_lib:ssl_fields(). server() -> @@ -161,10 +166,15 @@ do_get_status(Conn) -> %% =================================================================== connect(Options) -> - #{hostname := Host, username := Username, password := Password} = + #{ + hostname := Host, + username := Username, + password := Password, + request_timeout := RequestTimeout + } = Conf = proplists:get_value(options, Options), OpenOpts = maps:to_list(maps:with([port, sslopts], Conf)), - case eldap:open([Host], [{log, fun log/3} | OpenOpts]) of + case eldap:open([Host], [{log, fun log/3}, {timeout, RequestTimeout} | OpenOpts]) of {ok, Handle} = Ret -> case eldap:simple_bind(Handle, Username, Password) of ok -> Ret; diff --git a/rel/i18n/emqx_ldap.hocon b/rel/i18n/emqx_ldap.hocon index 99e00e63a..204431907 100644 --- a/rel/i18n/emqx_ldap.hocon +++ b/rel/i18n/emqx_ldap.hocon @@ -23,4 +23,10 @@ The syntax of the filter follows RFC 4515 and also supports placeholders.""" filter.label: """Filter""" +request_timeout.desc: +"""Sets the maximum time in milliseconds that is used for each individual request.""" + +request_timeout.label: +"""Request Timeout""" + }