Add passdb_need_set_credentials flag into mech_module structure to mark authentication mechanisms which need credentials update to work properly. diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/auth.c dovecot/src/auth/auth.c --- dovecot.vanilla/src/auth/auth.c 2006-06-23 13:42:22.123507928 +0400 +++ dovecot/src/auth/auth.c 2006-06-23 13:44:31.606823472 +0400 @@ -143,6 +143,17 @@ static bool auth_passdb_list_have_creden return FALSE; } +static int auth_passdb_list_have_set_credentials(struct auth *auth) +{ + struct auth_passdb *passdb; + + for (passdb = auth->passdbs; passdb != NULL; passdb = passdb->next) { + if (passdb->passdb->iface.set_credentials != NULL) + return TRUE; + } + return FALSE; +} + static void auth_mech_list_verify_passdb(struct auth *auth) { struct mech_module_list *list; @@ -154,6 +165,9 @@ static void auth_mech_list_verify_passdb if (list->module.passdb_need_credentials && !auth_passdb_list_have_credentials(auth)) break; + if (list->module.passdb_need_set_credentials && + !auth_passdb_list_have_set_credentials(auth)) + break; } if (list != NULL) { diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-anonymous.c dovecot/src/auth/mech-anonymous.c --- dovecot.vanilla/src/auth/mech-anonymous.c 2006-06-23 13:42:22.123507928 +0400 +++ dovecot/src/auth/mech-anonymous.c 2006-06-23 13:44:31.606823472 +0400 @@ -41,6 +41,7 @@ struct mech_module mech_anonymous = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) FALSE, + MEMBER(passdb_need_set_credentials) FALSE, mech_anonymous_auth_new, mech_generic_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-apop.c dovecot/src/auth/mech-apop.c --- dovecot.vanilla/src/auth/mech-apop.c 2006-06-23 13:42:22.123507928 +0400 +++ dovecot/src/auth/mech-apop.c 2006-06-23 13:44:31.607823320 +0400 @@ -156,6 +156,7 @@ const struct mech_module mech_apop = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) TRUE, + MEMBER(passdb_need_set_credentials) FALSE, mech_apop_auth_new, mech_apop_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-cram-md5.c dovecot/src/auth/mech-cram-md5.c --- dovecot.vanilla/src/auth/mech-cram-md5.c 2006-06-23 13:42:22.123507928 +0400 +++ dovecot/src/auth/mech-cram-md5.c 2006-06-23 13:44:31.607823320 +0400 @@ -188,6 +188,7 @@ struct mech_module mech_cram_md5 = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) TRUE, + MEMBER(passdb_need_set_credentials) FALSE, mech_cram_md5_auth_new, mech_cram_md5_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-digest-md5.c dovecot/src/auth/mech-digest-md5.c --- dovecot.vanilla/src/auth/mech-digest-md5.c 2006-06-23 13:42:22.123507928 +0400 +++ dovecot/src/auth/mech-digest-md5.c 2006-06-23 13:44:31.607823320 +0400 @@ -618,6 +618,7 @@ struct mech_module mech_digest_md5 = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) TRUE, + MEMBER(passdb_need_set_credentials) FALSE, mech_digest_md5_auth_new, mech_digest_md5_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-gssapi.c dovecot/src/auth/mech-gssapi.c --- dovecot.vanilla/src/auth/mech-gssapi.c 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech-gssapi.c 2006-06-23 13:44:31.607823320 +0400 @@ -393,6 +393,7 @@ const struct mech_module mech_gssapi = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) FALSE, + MEMBER(passdb_need_set_credentials) FALSE, mech_gssapi_auth_new, mech_gssapi_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech.h dovecot/src/auth/mech.h --- dovecot.vanilla/src/auth/mech.h 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech.h 2006-06-23 13:44:31.608823168 +0400 @@ -26,6 +26,7 @@ struct mech_module { enum mech_security_flags flags; unsigned int passdb_need_plain:1; unsigned int passdb_need_credentials:1; + unsigned int passdb_need_set_credentials:1; struct auth_request *(*auth_new)(void); void (*auth_initial)(struct auth_request *request, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-login.c dovecot/src/auth/mech-login.c --- dovecot.vanilla/src/auth/mech-login.c 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech-login.c 2006-06-23 13:44:31.608823168 +0400 @@ -84,6 +84,7 @@ const struct mech_module mech_login = { MEMBER(passdb_need_plain) TRUE, MEMBER(passdb_need_credentials) FALSE, + MEMBER(passdb_need_set_credentials) FALSE, mech_login_auth_new, mech_login_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-ntlm.c dovecot/src/auth/mech-ntlm.c --- dovecot.vanilla/src/auth/mech-ntlm.c 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech-ntlm.c 2006-06-23 13:44:31.608823168 +0400 @@ -262,6 +262,7 @@ const struct mech_module mech_ntlm = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) TRUE, + MEMBER(passdb_need_set_credentials) FALSE, mech_ntlm_auth_new, mech_generic_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-plain.c dovecot/src/auth/mech-plain.c --- dovecot.vanilla/src/auth/mech-plain.c 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech-plain.c 2006-06-23 13:44:31.608823168 +0400 @@ -91,6 +91,7 @@ struct mech_module mech_plain = { MEMBER(passdb_need_plain) TRUE, MEMBER(passdb_need_credentials) FALSE, + MEMBER(passdb_need_set_credentials) FALSE, mech_plain_auth_new, mech_generic_auth_initial, diff -urdpNX /usr/share/dontdiff -x Makefile dovecot.vanilla/src/auth/mech-rpa.c dovecot/src/auth/mech-rpa.c --- dovecot.vanilla/src/auth/mech-rpa.c 2006-06-23 13:42:22.124507776 +0400 +++ dovecot/src/auth/mech-rpa.c 2006-06-23 13:44:31.608823168 +0400 @@ -601,6 +601,7 @@ const struct mech_module mech_rpa = { MEMBER(passdb_need_plain) FALSE, MEMBER(passdb_need_credentials) TRUE, + MEMBER(passdb_need_set_credentials) FALSE, mech_rpa_auth_new, mech_generic_auth_initial,