Timo, Seems that "nopassword" extra field (more exactly, auth_request->no_password condition) is completely ignored in passdb-ldap.c, due to (line 112 as of Dovecot 1.1.7):
=== if (auth_request->passdb_password == NULL) { auth_request_log_error(auth_request, "ldap", "No password in reply"); } else if (ldap_next_entry(conn->ld, entry) != NULL) { auth_request_log_error(auth_request, "ldap", "pass_filter matched multiple objects, aborting"); } else if (auth_request->passdb_password == NULL && !auth_request->no_password) { auth_request_log_info(auth_request, "ldap", "Empty password returned without nopassword"); passdb_result = PASSDB_RESULT_PASSWORD_MISMATCH; } else { /* passdb_password may change on the way, so we'll need to strdup. */ password = t_strdup(auth_request->passdb_password); passdb_result = PASSDB_RESULT_OK; } === As we see, the first "if" block intercepts auth_request->passdb_password == NULL condition, ignoring auth_request->no_password and making line 127 (passdb_result = PASSDB_RESULT_OK) unreachable even if auth_request->no_password is set. For my local installation I've just removed the first "if" block (see patch in attachment), and it seems to fix the problem.
--- src/auth/passdb-ldap.c 2008-10-26 18:00:45.000000000 +0300 +++ src/auth/passdb-ldap.c.nopassword 2008-12-19 01:57:18.000000000 +0300 @@ -109,10 +109,7 @@ password = NULL; ldap_query_save_result(conn, entry, auth_request); - if (auth_request->passdb_password == NULL) { - auth_request_log_error(auth_request, "ldap", - "No password in reply"); - } else if (ldap_next_entry(conn->ld, entry) != NULL) { + if (ldap_next_entry(conn->ld, entry) != NULL) { auth_request_log_error(auth_request, "ldap", "pass_filter matched multiple objects, aborting"); } else if (auth_request->passdb_password == NULL &&