]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: If passdb sql returned only NULLs for userdb_ fields, use userdb prefetch anyway.
authorTimo Sirainen <tss@iki.fi>
Wed, 10 Jul 2013 02:29:45 +0000 (05:29 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 10 Jul 2013 02:29:45 +0000 (05:29 +0300)
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/passdb-sql.c

index 1f6abb6e117cc9a4eb79ee5c821d71719d197999..cfcf24bcd75b0e190ad17cfae3e93cf2882dfd83 100644 (file)
@@ -1397,6 +1397,16 @@ void auth_request_set_field(struct auth_request *request,
        }
 }
 
+void auth_request_set_null_field(struct auth_request *request, const char *name)
+{
+       if (strncmp(name, "userdb_", 7) == 0) {
+               /* make sure userdb prefetch is used even if all the fields
+                  were returned as NULL. */
+               if (request->userdb_reply == NULL)
+                       auth_request_init_userdb_reply(request);
+       }
+}
+
 void auth_request_set_field_keyvalue(struct auth_request *request,
                                     const char *field,
                                     const char *default_scheme)
index f5fb45a2dfbfb64cdccc57569c8de7d858a92ff9..be02283cd3a8fc2ae08dd76b01802d8fb608de59 100644 (file)
@@ -192,6 +192,7 @@ bool auth_request_set_login_username(struct auth_request *request,
 void auth_request_set_field(struct auth_request *request,
                            const char *name, const char *value,
                            const char *default_scheme) ATTR_NULL(4);
+void auth_request_set_null_field(struct auth_request *request, const char *name);
 void auth_request_set_field_keyvalue(struct auth_request *request,
                                     const char *field,
                                     const char *default_scheme) ATTR_NULL(3);
index e0def7d0b719ad64d4c8a986fe81ae83cb004491..55fe7167e19c670b98d688dbe7ffdaec7239ab7d 100644 (file)
@@ -45,7 +45,11 @@ static void sql_query_save_results(struct sql_result *result,
                name = sql_result_get_field_name(result, i);
                value = sql_result_get_field_value(result, i);
 
-               if (*name != '\0' && value != NULL) {
+               if (*name == '\0')
+                       ;
+               else if (value == NULL)
+                       auth_request_set_null_field(auth_request, name);
+               else {
                        auth_request_set_field(auth_request, name, value,
                                module->conn->set.default_pass_scheme);
                }