From: Timo Sirainen Date: Wed, 14 Apr 2010 13:06:59 +0000 (+0300) Subject: auth: Fixed userdb tempfail to work with blocking userdbs. X-Git-Tag: 2.0.beta5~123 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=88e9835c4d8973c62cd4db1ec7324ff46dd3ff15;p=thirdparty%2Fdovecot%2Fcore.git auth: Fixed userdb tempfail to work with blocking userdbs. --HG-- branch : HEAD --- diff --git a/src/auth/auth-request.c b/src/auth/auth-request.c index e95fc7ace4..bff76fc4bc 100644 --- a/src/auth/auth-request.c +++ b/src/auth/auth-request.c @@ -1198,6 +1198,7 @@ void auth_request_set_userdb_field(struct auth_request *request, value = dec2str(gid); } else if (strcmp(name, "tempfail") == 0) { request->userdb_lookup_failed = TRUE; + return; } else if (strcmp(name, "user") == 0) { auth_request_change_userdb_user(request, value); return; diff --git a/src/auth/auth-stream.c b/src/auth/auth-stream.c index 631505b9c3..d94e51e252 100644 --- a/src/auth/auth-stream.c +++ b/src/auth/auth-stream.c @@ -97,6 +97,10 @@ const char *auth_stream_reply_find(struct auth_stream_reply *reply, return NULL; else { keylen = strlen(key); + if (len == keylen) { + /* key without =value */ + return ""; + } i_assert(len > keylen); idx += keylen + 1; len -= keylen + 1; diff --git a/src/auth/auth-worker-client.c b/src/auth/auth-worker-client.c index 62c893f78e..16cd67d0a6 100644 --- a/src/auth/auth-worker-client.c +++ b/src/auth/auth-worker-client.c @@ -335,21 +335,12 @@ lookup_user_callback(enum userdb_result result, struct auth_worker_client *client = auth_request->context; struct auth_stream_reply *reply = auth_request->userdb_reply; string_t *str; - const char *value; - - if (auth_request->userdb_lookup_failed) - result = USERDB_RESULT_INTERNAL_FAILURE; str = t_str_new(128); str_printfa(str, "%u\t", auth_request->id); switch (result) { case USERDB_RESULT_INTERNAL_FAILURE: str_append(str, "FAIL\t"); - if (auth_request->userdb_lookup_failed) { - value = auth_stream_reply_find(reply, "reason"); - if (value != NULL) - str_printfa(str, "reason=%s", value); - } break; case USERDB_RESULT_USER_UNKNOWN: str_append(str, "NOTFOUND\t"); @@ -357,6 +348,8 @@ lookup_user_callback(enum userdb_result result, case USERDB_RESULT_OK: str_append(str, "OK\t"); str_append(str, auth_stream_reply_export(reply)); + if (auth_request->userdb_lookup_failed) + str_append(str, "\ttempfail"); break; } str_append_c(str, '\n'); diff --git a/src/auth/userdb-blocking.c b/src/auth/userdb-blocking.c index 90e2a03ad2..c70e1d2be1 100644 --- a/src/auth/userdb-blocking.c +++ b/src/auth/userdb-blocking.c @@ -39,6 +39,9 @@ static bool user_callback(const char *reply, void *context) if (*args != '\0') { request->userdb_reply = auth_stream_reply_init(request->pool); auth_stream_reply_import(request->userdb_reply, args); + if (auth_stream_reply_find(request->userdb_reply, + "tempfail") != NULL) + request->userdb_lookup_failed = TRUE; } auth_request_userdb_callback(result, request);