]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
pop3: Added pop3_delete_type setting with values "default", "expunge" or "flag".
authorTimo Sirainen <tss@iki.fi>
Wed, 12 Aug 2015 09:52:06 +0000 (12:52 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 12 Aug 2015 09:52:06 +0000 (12:52 +0300)
This is related to pop3_deleted_flag setting. The main behefit here is that
you can now hide messages from POP3 by setting pop3_deleted_flag, but
without changing the actual deletion behavior by setting
pop3_delete_type=expunge.

src/pop3/pop3-commands.c
src/pop3/pop3-settings.c
src/pop3/pop3-settings.h

index 82c9a3ea99b3f9e6ac15853eccca4158c70d8bef..ccb960bf2188e0d12268aab0a5d9d154a7871118 100644 (file)
@@ -219,10 +219,15 @@ static int client_verify_ordering(struct client *client,
 
 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++;
 }
 
index 672d94b11a5b7dd7a082f4405564da30231d0126..4629c6cda0450b14ed74f1caf349c5aefaa4d5bb 100644 (file)
@@ -72,6 +72,7 @@ static const struct setting_define pop3_setting_defines[] = {
        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
 };
@@ -88,7 +89,8 @@ static const struct pop3_settings pop3_default_settings = {
        .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[] = {
@@ -156,6 +158,24 @@ pop3_settings_verify(void *_set, pool_t pool ATTR_UNUSED, const char **error_r)
 
        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> */
index 90cbf7766247b7e4011410ab4acb332021e2cbe5..3ea4a0079d9ee62b76737daee2dfba9c54893bcc 100644 (file)
@@ -8,6 +8,10 @@ enum pop3_client_workarounds {
        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 {
@@ -24,8 +28,10 @@ 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;