static void client_expunge(struct client *client, struct mail *mail)
{
- if (client->deleted_kw != NULL)
- mail_update_keywords(mail, MODIFY_ADD, client->deleted_kw);
- else
+ switch (client->set->parsed_delete_type) {
+ case POP3_DELETE_TYPE_EXPUNGE:
mail_expunge(mail);
+ break;
+ case POP3_DELETE_TYPE_FLAG:
+ i_assert(client->deleted_kw != NULL);
+ mail_update_keywords(mail, MODIFY_ADD, client->deleted_kw);
+ break;
+ }
client->expunged_count++;
}
DEF(SET_STR, pop3_logout_format),
DEF(SET_ENUM, pop3_uidl_duplicates),
DEF(SET_STR, pop3_deleted_flag),
+ DEF(SET_ENUM, pop3_delete_type),
SETTING_DEFINE_LIST_END
};
.pop3_client_workarounds = "",
.pop3_logout_format = "top=%t/%p, retr=%r/%b, del=%d/%m, size=%s",
.pop3_uidl_duplicates = "allow:rename",
- .pop3_deleted_flag = ""
+ .pop3_deleted_flag = "",
+ .pop3_delete_type = "default:expunge:flag"
};
static const struct setting_parser_info *pop3_setting_dependencies[] = {
if (pop3_settings_parse_workarounds(set, error_r) < 0)
return FALSE;
+ if (strcmp(set->pop3_delete_type, "default") == 0) {
+ if (set->pop3_deleted_flag[0] == '\0')
+ set->parsed_delete_type = POP3_DELETE_TYPE_EXPUNGE;
+ else
+ set->parsed_delete_type = POP3_DELETE_TYPE_FLAG;
+ } else if (strcmp(set->pop3_delete_type, "expunge") == 0) {
+ set->parsed_delete_type = POP3_DELETE_TYPE_EXPUNGE;
+ } else if (strcmp(set->pop3_delete_type, "flag") == 0) {
+ if (set->pop3_deleted_flag[0] == '\0') {
+ *error_r = "pop3_delete_type=flag, but pop3_deleted_flag not set";
+ return FALSE;
+ }
+ set->parsed_delete_type = POP3_DELETE_TYPE_FLAG;
+ } else {
+ *error_r = t_strdup_printf("pop3_delete_type: Unknown value '%s'",
+ set->pop3_delete_type);
+ return FALSE;
+ }
return TRUE;
}
/* </settings checks> */
WORKAROUND_OUTLOOK_NO_NULS = 0x01,
WORKAROUND_OE_NS_EOH = 0x02
};
+enum pop3_delete_type {
+ POP3_DELETE_TYPE_EXPUNGE = 0,
+ POP3_DELETE_TYPE_FLAG,
+};
/* </settings checks> */
struct pop3_settings {
const char *pop3_logout_format;
const char *pop3_uidl_duplicates;
const char *pop3_deleted_flag;
+ const char *pop3_delete_type;
enum pop3_client_workarounds parsed_workarounds;
+ enum pop3_delete_type parsed_delete_type;
};
extern const struct setting_parser_info pop3_setting_parser_info;