]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Use caching dns client for proxy lookups
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 10 Sep 2021 06:34:57 +0000 (09:34 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 17 Jan 2022 11:52:09 +0000 (13:52 +0200)
src/auth/auth-request.c
src/auth/auth.c
src/auth/auth.h
src/auth/test-mech.c

index 51b44d9e2dba9c0b4e4c0faf629a8dffbff819da..6add44c70b9b209729903af546ce3645b0cdee27 100644 (file)
@@ -33,8 +33,6 @@
 #include <sys/stat.h>
 
 #define AUTH_SUBSYS_PROXY "proxy"
-#define AUTH_DNS_SOCKET_PATH "dns-client"
-#define AUTH_DNS_DEFAULT_TIMEOUT_MSECS (1000*10)
 #define AUTH_DNS_WARN_MSECS 500
 #define AUTH_REQUEST_MAX_DELAY_SECS (60*5)
 #define CACHED_PASSWORD_SCHEME "SHA1"
@@ -2137,23 +2135,17 @@ static int auth_request_proxy_host_lookup(struct auth_request *request,
                                          const char *host,
                                          auth_request_proxy_cb_t *callback)
 {
+       struct auth *auth = auth_default_service();
        struct auth_request_proxy_dns_lookup_ctx *ctx;
-       struct dns_lookup_settings dns_set;
        const char *value;
        unsigned int secs;
 
        /* need to do dns lookup for the host */
-       i_zero(&dns_set);
-       dns_set.dns_client_socket_path = AUTH_DNS_SOCKET_PATH;
-       dns_set.timeout_msecs = AUTH_DNS_DEFAULT_TIMEOUT_MSECS;
-       dns_set.event_parent = request->event;
        value = auth_fields_find(request->fields.extra_fields, "proxy_timeout");
        if (value != NULL) {
                if (str_to_uint(value, &secs) < 0) {
                        auth_request_log_error(request, AUTH_SUBSYS_PROXY,
                                "Invalid proxy_timeout value: %s", value);
-               } else {
-                       dns_set.timeout_msecs = secs*1000;
                }
        }
 
@@ -2162,8 +2154,9 @@ static int auth_request_proxy_host_lookup(struct auth_request *request,
        auth_request_ref(request);
        request->dns_lookup_ctx = ctx;
 
-       if (dns_lookup(host, &dns_set, auth_request_proxy_dns_callback, ctx,
-                       &ctx->dns_lookup) < 0) {
+       if (dns_client_lookup(auth->dns_client, host, request->event,
+                             auth_request_proxy_dns_callback, ctx,
+                             &ctx->dns_lookup) < 0) {
                /* failed early */
                return -1;
        }
index 845c43cadfd7770f90369290eabfcf2dbf1dfac1..f2f3fda20c19f021940f17883ff9b0697a7751ac 100644 (file)
 #include "passdb-template.h"
 #include "userdb-template.h"
 #include "auth.h"
+#include "dns-lookup.h"
+
+#define AUTH_DNS_SOCKET_PATH "dns-client"
+#define AUTH_DNS_DEFAULT_TIMEOUT_MSECS (1000*10)
+#define AUTH_DNS_IDLE_TIMEOUT_MSECS (1000*60)
+#define AUTH_DNS_CACHE_TTL_SECS 10
 
 struct event *auth_event;
 struct event_category event_category_auth = {
@@ -315,6 +321,7 @@ static void auth_init(struct auth *auth)
 {
        struct auth_passdb *passdb;
        struct auth_userdb *userdb;
+       struct dns_lookup_settings dns_set;
 
        for (passdb = auth->masterdbs; passdb != NULL; passdb = passdb->next)
                auth_passdb_init(passdb);
@@ -322,6 +329,14 @@ static void auth_init(struct auth *auth)
                auth_passdb_init(passdb);
        for (userdb = auth->userdbs; userdb != NULL; userdb = userdb->next)
                userdb_init(userdb->userdb);
+
+       i_zero(&dns_set);
+       dns_set.dns_client_socket_path = AUTH_DNS_SOCKET_PATH;
+       dns_set.timeout_msecs = AUTH_DNS_DEFAULT_TIMEOUT_MSECS;
+       dns_set.idle_timeout_msecs = AUTH_DNS_IDLE_TIMEOUT_MSECS;
+       dns_set.cache_ttl_secs = AUTH_DNS_CACHE_TTL_SECS;
+
+       auth->dns_client = dns_client_init(&dns_set);
 }
 
 static void auth_deinit(struct auth *auth)
@@ -335,6 +350,8 @@ static void auth_deinit(struct auth *auth)
                passdb_deinit(passdb->passdb);
        for (userdb = auth->userdbs; userdb != NULL; userdb = userdb->next)
                userdb_deinit(userdb->userdb);
+
+       dns_client_deinit(&auth->dns_client);
 }
 
 struct auth *auth_find_service(const char *name)
index 3ca5a9bb12b70ba10420b88ae615ce83410bf75c..f700e29d5c7ad13af53c48eee4921f5fd3013d69 100644 (file)
@@ -74,6 +74,8 @@ struct auth {
        struct auth_passdb *masterdbs;
        struct auth_passdb *passdbs;
        struct auth_userdb *userdbs;
+
+       struct dns_client *dns_client;
 };
 
 extern struct auth_penalty *auth_penalty;
index 8a2c7b357bd2d99dfff39089574c6657bba87211..f6f5481282de4e1e3324b8c5366facdb4499d941 100644 (file)
@@ -3,6 +3,7 @@
 #include "test-auth.h"
 #include "auth.h"
 #include "str.h"
+#include "ioloop.h"
 #include "auth-common.h"
 #include "auth-request.h"
 #include "auth-request-handler-private.h"
@@ -408,5 +409,9 @@ int main(void)
                NULL
        };
 
-       return test_run(test_functions);
+       struct ioloop *ioloop = io_loop_create();
+       io_loop_set_current(ioloop);
+       int ret = test_run(test_functions);
+       io_loop_destroy(&ioloop);
+       return ret;
 }