event_unref(&event);
client_destroy(imap_client, "Client state initialization failed");
return -1;
+ case IMAP_STATE_INCONSISTENT:
+ event_unref(&event);
+ client_destroy(imap_client, "Client state inconsistent");
+ return 0;
case IMAP_STATE_OK:
break;
}
flags |= MAILBOX_FLAG_DROP_RECENT;
box = mailbox_alloc(ns->list, state->vname, flags);
if (mailbox_open(box) < 0) {
- *error_r = t_strdup_printf("Couldn't open mailbox: %s",
- mailbox_get_last_internal_error(box, NULL));
+ enum mail_error error;
+ const char *errstr = mailbox_get_last_internal_error(box, &error);
+ const char *full_errstr = t_strdup_printf("Couldn't open mailbox: %s", errstr);
+ if (error == MAIL_ERROR_NOTFOUND) {
+ e_debug(box->event, "Unhibernation failed to open mailbox: %s", errstr);
+ client_disconnect_with_error(client,
+ "IMAP session state is inconsistent, please relogin.");
+ mailbox_free(&box);
+ return IMAP_STATE_INCONSISTENT;
+ }
+ *error_r = full_errstr;
mailbox_free(&box);
return IMAP_STATE_ERROR;
}
IMAP_STATE_OK, /* Success */
IMAP_STATE_CORRUPTED, /* Data corruption or invalid state */
IMAP_STATE_ERROR, /* General error (e.g., permission, resource issues) */
+ IMAP_STATE_INCONSISTENT /* State inconsistency (e.g., mailbox not found) */
};
/* Export the IMAP client state to the given buffer. Returns 1 if ok,