i_unreached();
}
+static const char *
+auth_request_cache_result_to_str(enum auth_request_cache_result result)
+{
+ switch(result) {
+ case AUTH_REQUEST_CACHE_NONE:
+ return "none";
+ case AUTH_REQUEST_CACHE_HIT:
+ return "hit";
+ case AUTH_REQUEST_CACHE_MISS:
+ return "miss";
+ default:
+ i_unreached();
+ }
+}
+
void auth_request_passdb_lookup_begin(struct auth_request *request)
{
struct event *event;
i_assert(request->passdb != NULL);
i_assert(!request->userdb_lookup);
+ request->passdb_cache_result = AUTH_REQUEST_CACHE_NONE;
+
name = (request->passdb->set->name[0] != '\0' ?
request->passdb->set->name :
request->passdb->passdb->iface.name);
event_create_passthrough(event)->
set_name("auth_passdb_request_finished")->
add_str("result", passdb_result_to_string(result));
+ if (request->passdb_cache_result != AUTH_REQUEST_CACHE_NONE &&
+ request->set->cache_ttl != 0 && request->set->cache_size != 0)
+ e->add_str("cache", auth_request_cache_result_to_str(request->passdb_cache_result));
e_debug(e->event(), "Finished passdb lookup");
event_unref(&event);
array_pop_back(&request->authdb_event);
i_assert(request->userdb != NULL);
i_assert(request->userdb_lookup);
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_NONE;
+
name = (request->userdb->set->name[0] != '\0' ?
request->userdb->set->name :
request->userdb->userdb->iface->name);
event_create_passthrough(event)->
set_name("auth_userdb_request_finished")->
add_str("result", userdb_result_to_string(result));
+ if (request->userdb_cache_result != AUTH_REQUEST_CACHE_NONE &&
+ request->set->cache_ttl != 0 && request->set->cache_size != 0)
+ e->add_str("cache", auth_request_cache_result_to_str(request->userdb_cache_result));
e_debug(e->event(), "Finished userdb lookup");
event_unref(&event);
array_pop_back(&request->authdb_event);
if (passdb_cache_lookup_credentials(request, cache_key,
&cache_cred, &cache_scheme,
&result, FALSE)) {
+ request->passdb_cache_result = AUTH_REQUEST_CACHE_HIT;
passdb_handle_credentials(
result, cache_cred, cache_scheme,
auth_request_lookup_credentials_finish,
request);
return;
+ } else {
+ request->passdb_cache_result = AUTH_REQUEST_CACHE_MISS;
}
}
&expired, &neg_expired);
if (value == NULL || (expired && !use_expired)) {
stats->auth_cache_miss_count++;
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_MISS;
e_debug(request->event,
value == NULL ? "%suserdb cache miss" :
"%suserdb cache expired",
return FALSE;
}
stats->auth_cache_hit_count++;
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_HIT;
e_debug(request->event,
"%suserdb cache hit: %s",
auth_request_get_log_prefix_db(request), value);
if (request->userdb_lookup_tempfailed) {
/* no caching */
} else if (result != USERDB_RESULT_INTERNAL_FAILURE) {
- if (!request->userdb_result_from_cache)
+ if (request->userdb_cache_result != AUTH_REQUEST_CACHE_HIT)
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->private_callback.userdb = callback;
request->user_changed_by_lookup = FALSE;
request->userdb_lookup = TRUE;
- request->userdb_result_from_cache = FALSE;
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_NONE;
if (request->fields.userdb_reply == NULL)
auth_request_init_userdb_reply(request, TRUE);
else {
if (auth_request_lookup_user_cache(request, cache_key,
&result, FALSE)) {
- request->userdb_result_from_cache = TRUE;
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_HIT;
auth_request_userdb_callback(result, request);
return;
+ } else {
+ request->userdb_cache_result = AUTH_REQUEST_CACHE_MISS;
}
}
AUTH_REQUEST_SECURED_TLS,
};
+enum auth_request_cache_result {
+ AUTH_REQUEST_CACHE_NONE,
+ AUTH_REQUEST_CACHE_MISS,
+ AUTH_REQUEST_CACHE_HIT,
+};
+
/* All auth request fields are exported to auth-worker process. */
struct auth_request_fields {
/* user contains the user who is being authenticated.
void *context;
+ enum auth_request_cache_result passdb_cache_result;
+ enum auth_request_cache_result userdb_cache_result;
+
/* this is a lookup on auth socket (not login socket).
skip any proxying stuff if enabled. */
bool auth_only:1;
/* userdb_* fields have been set by the passdb lookup, userdb prefetch
will work. */
bool userdb_prefetch_set:1;
- /* userdb lookup's results are from cache */
- bool userdb_result_from_cache:1;
bool stats_sent:1;
bool policy_refusal:1;
bool policy_processed:1;