DEF(SET_SIZE, cache_size),
DEF(SET_TIME, cache_ttl),
DEF(SET_TIME, cache_negative_ttl),
+ DEF(SET_BOOL, cache_verify_password_with_worker),
DEF(SET_STR, username_chars),
DEF(SET_STR, username_translation),
DEF(SET_STR, username_format),
.cache_size = 0,
.cache_ttl = 60*60,
.cache_negative_ttl = 60*60,
+ .cache_verify_password_with_worker = FALSE,
.username_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@",
.username_translation = "",
.username_format = "%Lu",
/* Copyright (c) 2004-2018 Dovecot authors, see the included COPYING file */
#include "auth-common.h"
+#include "str.h"
#include "strescape.h"
#include "restrict-process-size.h"
#include "auth-request-stats.h"
+#include "auth-worker-server.h"
#include "password-scheme.h"
#include "passdb.h"
#include "passdb-cache.h"
+#include "passdb-blocking.h"
struct auth_cache *passdb_cache = NULL;
return TRUE;
}
+static bool passdb_cache_verify_plain_callback(const char *reply, void *context)
+{
+ struct auth_request *request = context;
+ enum passdb_result result;
+
+ result = passdb_blocking_auth_worker_reply_parse(request, reply);
+ auth_request_verify_plain_callback_finish(result, request);
+ auth_request_unref(&request);
+ return TRUE;
+}
+
bool passdb_cache_verify_plain(struct auth_request *request, const char *key,
const char *password,
enum passdb_result *result_r, bool use_expired)
/* negative cache entry */
auth_request_log_unknown_user(request, AUTH_SUBSYS_DB);
*result_r = PASSDB_RESULT_USER_UNKNOWN;
+ auth_request_verify_plain_callback_finish(*result_r, request);
return TRUE;
}
auth_request_log_info(request, AUTH_SUBSYS_DB,
"Cached NULL password access");
ret = 1;
+ } else if (request->set->cache_verify_password_with_worker) {
+ string_t *str;
+
+ str = t_str_new(128);
+ str_printfa(str, "PASSW\t%u\t", request->passdb->passdb->id);
+ str_append_tabescaped(str, password);
+ str_append_c(str, '\t');
+ str_append_tabescaped(str, cached_pw);
+ str_append_c(str, '\t');
+ auth_request_export(request, str);
+
+ auth_request_log_debug(request, AUTH_SUBSYS_DB, "cache: "
+ "validating password on worker");
+ auth_request_ref(request);
+ auth_worker_call(request->pool, request->user, str_c(str),
+ passdb_cache_verify_plain_callback, request);
+ return TRUE;
} else {
scheme = password_get_scheme(&cached_pw);
i_assert(scheme != NULL);
*result_r = ret > 0 ? PASSDB_RESULT_OK :
PASSDB_RESULT_PASSWORD_MISMATCH;
+
+ auth_request_verify_plain_callback_finish(*result_r, request);
return TRUE;
}