]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mail_storage_service_lookup*() now separates userdb lookup and user setting errors.
authorTimo Sirainen <tss@iki.fi>
Tue, 16 Mar 2010 18:21:48 +0000 (20:21 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 16 Mar 2010 18:21:48 +0000 (20:21 +0200)
--HG--
branch : HEAD

src/doveadm/doveadm-mail.c
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h
src/plugins/expire/expire-tool.c
src/util/script.c

index 654aa9db9720fa0e23bf86f4cb2597c904e14cf7..a2637107335ed0c5361119b86cedb436e72e4c6a 100644 (file)
@@ -183,7 +183,7 @@ doveadm_mail_all_users(doveadm_mail_command_t *cmd,
                        else if (ret == 0)
                                i_info("User no longer exists, skipping");
                } T_END;
-               if (ret < 0)
+               if (ret == -1)
                        break;
                if (doveadm_verbose) {
                        if (++user_idx % interval == 0) {
index 594830ffb2b852afcc334b9f5334074910bd74b7..2830daa1b3eab5c3ddb99bd308ed05030ce4759f 100644 (file)
@@ -812,12 +812,15 @@ int mail_storage_service_lookup(struct mail_storage_service_ctx *ctx,
        if (userdb_fields != NULL) {
                auth_user_fields_parse(userdb_fields, temp_pool, &reply);
                if (user_reply_handle(user, &reply, error_r) < 0)
-                       ret = -1;
+                       ret = -2;
        }
        pool_unref(&temp_pool);
 
        /* load per-user plugins */
-       mail_storage_service_load_modules(ctx, user_info, user->user_set);
+       if (ret > 0) {
+               mail_storage_service_load_modules(ctx, user_info,
+                                                 user->user_set);
+       }
 
        *user_r = user;
        return ret;
index 56d3277e04d268d45e45cb61998a76c6c694f405..75148c67ad483a7431eaf9e9278269f1b592b16b 100644 (file)
@@ -60,7 +60,8 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
    or _all_init(). */
 void mail_storage_service_init_settings(struct mail_storage_service_ctx *ctx,
                                        const struct mail_storage_service_input *input);
-/* Returns 1 if ok, 0 if user wasn't found, -1 if error. */
+/* Returns 1 if ok, 0 if user wasn't found, -1 if fatal error,
+   -2 if user had invalid settings. */
 int mail_storage_service_lookup(struct mail_storage_service_ctx *ctx,
                                const struct mail_storage_service_input *input,
                                struct mail_storage_service_user **user_r,
index 59241f6a138995633e0418839b6b3e316565182b..badadd26ee7aa78c0cc76bb8bf1e0bc36afb7a10 100644 (file)
@@ -23,6 +23,7 @@ struct expire_context {
        struct mail_user *mail_user;
        struct expire_env *env;
        bool testrun;
+       bool userdb_lookup_failed;
 };
 
 static int expire_init_user(struct expire_context *ctx, const char *user)
@@ -43,7 +44,12 @@ static int expire_init_user(struct expire_context *ctx, const char *user)
        if (ret <= 0) {
                if (ret < 0 || ctx->testrun)
                        i_error("%s", errstr);
-               return ret;
+               if (ret == -1) {
+                       /* the next userdb lookup is most likely
+                          going to fail too */
+                       ctx->userdb_lookup_failed = TRUE;
+               }
+               return ret < 0 ? -1 : 0;
        }
 
        if (mail_user_set_plugin_getenv(ctx->mail_user->set, "expire") == NULL)
@@ -263,6 +269,8 @@ static void expire_run(struct master_service *service, bool testrun)
                } T_END;
 
                if (ret < 0) {
+                       if (ctx.userdb_lookup_failed)
+                               break;
                        /* failed to update */
                } else if (next_expire == 0) {
                        /* no more messages or mailbox deleted */
index 38912fb1d7e676f5ab92e897e2dbff9e32d32a89..4169ce83a632ed40ea9af106bac40fceda46f914 100644 (file)
@@ -93,7 +93,7 @@ static void client_connected(const struct master_service_connection *conn)
                t_strdup_printf("script(%s): ", input.username));
 
        service_ctx = mail_storage_service_init(master_service, NULL, flags);
-       if (mail_storage_service_lookup(service_ctx, &input, &user, &error) < 0)
+       if (mail_storage_service_lookup(service_ctx, &input, &user, &error) <= 0)
                i_fatal("%s", error);
        mail_storage_service_restrict_setenv(service_ctx, user);