]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Don't re-insert userdb results from auth cache data back to cache.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 11 Oct 2016 10:18:53 +0000 (13:18 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 13 Oct 2016 08:28:17 +0000 (10:28 +0200)
This was also breaking TTLs for the cached userdb results, because each
re-insert reset the TTL.

src/auth/auth-request.c
src/auth/auth-request.h

index b2e051beaee8ef3197c77ef86a0118374d94a3af..f5a2e26ddae3c7d0fa5d5728c99cb155c1ea1a37 100644 (file)
@@ -1327,9 +1327,10 @@ void auth_request_userdb_callback(enum userdb_result result,
 
        if (request->userdb_lookup_tempfailed) {
                /* no caching */
-       } else if (result != USERDB_RESULT_INTERNAL_FAILURE)
-               auth_request_userdb_save_cache(request, result);
-       else if (passdb_cache != NULL && userdb->cache_key != NULL) {
+       } else if (result != USERDB_RESULT_INTERNAL_FAILURE) {
+               if (!request->userdb_result_from_cache)
+                       auth_request_userdb_save_cache(request, result);
+       } else if (passdb_cache != NULL && userdb->cache_key != NULL) {
                /* lookup failed. if we're looking here only because the
                   request was expired in cache, fallback to using cached
                   expired record. */
@@ -1353,6 +1354,7 @@ void auth_request_lookup_user(struct auth_request *request,
 
        request->private_callback.userdb = callback;
        request->userdb_lookup = TRUE;
+       request->userdb_result_from_cache = FALSE;
        if (request->userdb_reply == NULL)
                auth_request_init_userdb_reply(request);
        else {
@@ -1369,6 +1371,7 @@ void auth_request_lookup_user(struct auth_request *request,
 
                if (auth_request_lookup_user_cache(request, cache_key,
                                                   &result, FALSE)) {
+                       request->userdb_result_from_cache = TRUE;
                        auth_request_userdb_callback(result, request);
                        return;
                }
index de525776d00ec4be151fb710943e49923e602fee..51f34c245b913236fb8414d3bc2ee9c727ea11d9 100644 (file)
@@ -144,6 +144,8 @@ struct auth_request {
        /* userdb_* fields have been set by the passdb lookup, userdb prefetch
           will work. */
        unsigned int userdb_prefetch_set:1;
+       /* userdb lookup's results are from cache */
+       unsigned int userdb_result_from_cache:1;
        unsigned int stats_sent:1;
        unsigned int policy_refusal:1;
        unsigned int policy_processed:1;