if (request->set->policy_report_after_auth)
auth_policy_report(request);
- if (auth_fields_exists(request->fields.extra_fields, "nodelay")) {
+ e_debug(request->event, "handling failure, nodelay=%d",
+ (int) request->failure_nodelay);
+ if (request->failure_nodelay) {
/* passdb specifically requested not to delay the reply. */
handler->callback(reply, handler->conn);
auth_request_unref(&request);
&request->fields.remote_ip);
} else if (strcmp(name, "fail") == 0) {
request->failed = TRUE;
+ } else if (strcmp(name, "nodelay") == 0) {
+ /* don't delay replying to client of the failure */
+ request->failure_nodelay = TRUE;
+ auth_fields_add(request->fields.extra_fields, name, value, 0);
+ return;
} else if (strcmp(name, "delay_until") == 0) {
time_t timestamp;
unsigned int extra_secs = 0;
bool stats_sent:1;
bool policy_refusal:1;
bool policy_processed:1;
+ /* "nodelay" passdb extra field: Disable delay if auth fails. This
+ needs to be tracked outside regular extra fields, because they get
+ rolled back on passdb failure. */
+ bool failure_nodelay:1;
bool event_finished_sent:1;
request->userdb = auth->userdbs;
handler->refcount = 1;
- auth_fields_add(request->fields.extra_fields, "nodelay", "", 0);
+ request->failure_nodelay = TRUE;
auth_request_ref(request);
auth_request_state_count[AUTH_REQUEST_STATE_NEW] = 1;