In lib-storage/index/maildir/maildir-storage.c
maildir_is_valid_create_name() and maildir_is_valid_existing_name() the
following sequence of tests appear but I don't really understand why

        if ((storage->flags & MAIL_STORAGE_FLAG_FULL_FS_ACCESS) != 0)
                return TRUE;

        if (*name == '~' || strchr(name, '/') != NULL)
                return FALSE;

If MAIL_STORAGE_FLAG_FULL_FS_ACCESS is set then the validator funcs return
TRUE immediately and code elsewhere will do appropriate home_exapand for
mailbox names.  However if MAIL_STORAGE_FLAG_FULL_FS_ACCESS is not set the
(*name == '~') test prevents mailbox names that begin with '~'.

Why is it not possible to have mailbox names that begin with '~' but
without '~' carrying any special meaning?

I have been working on a patch (appended but incomplete; the option only
works against maildir atm) that adds a new option mail_allow_tilde and my
admittedly limited testing seems to indicate that it does the right thing
but maybe I am barking up the wrong tree.  Am I missing something here?

----------------------------------------
# HG changeset patch
# User <[EMAIL PROTECTED]>
# Date 1185368923 -3600
# Node ID ab9cf3790ea9b5486afa6498f60c6bf6fb2e5f1e
# Parent  a23be695672737967a10613d7dca2a6f53b5d96d
create new option mail_allow_tilde

diff -r a23be6956727 -r ab9cf3790ea9 
src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c   Tue Jul 24 05:48:03 
2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.c   Wed Jul 25 14:08:43 
2007 +0100
@@ -240,7 +240,9 @@ static bool maildir_is_valid_create_name
        if ((storage->flags & MAIL_STORAGE_FLAG_FULL_FS_ACCESS) != 0)
                return TRUE;
 
-       if (*name == '~' || strchr(name, '/') != NULL)
+       if ((*name == '~' &&
+            (storage->flags & MAIL_STORAGE_FLAG_ALLOW_TILDE) == 0) ||
+            strchr(name, '/') != NULL)
                return FALSE;
 
        if (name[0] == '.' && (name[1] == '\0' ||
@@ -264,7 +266,9 @@ static bool maildir_is_valid_existing_na
        if ((storage->flags & MAIL_STORAGE_FLAG_FULL_FS_ACCESS) != 0)
                return TRUE;
 
-       if (*name == '~' || strchr(name, '/') != NULL)
+       if ((*name == '~' &&
+            (storage->flags & MAIL_STORAGE_FLAG_ALLOW_TILDE) == 0) ||
+           strchr(name, '/') != NULL)
                return FALSE;
 
        if (name[0] == '.' && (name[1] == '\0' ||
diff -r a23be6956727 -r ab9cf3790ea9 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c    Tue Jul 24 05:48:03 2007 +0300
+++ b/src/lib-storage/mail-storage.c    Wed Jul 25 14:08:43 2007 +0100
@@ -66,6 +66,8 @@ void mail_storage_parse_env(enum mail_st
        *flags_r = 0;
        if (getenv("FULL_FILESYSTEM_ACCESS") != NULL)
                *flags_r |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS;
+       if (getenv("ALLOW_TILDE") != NULL)
+               *flags_r |= MAIL_STORAGE_FLAG_ALLOW_TILDE;
        if (getenv("DEBUG") != NULL)
                *flags_r |= MAIL_STORAGE_FLAG_DEBUG;
        if (getenv("MMAP_DISABLE") != NULL)
diff -r a23be6956727 -r ab9cf3790ea9 src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h    Tue Jul 24 05:48:03 2007 +0300
+++ b/src/lib-storage/mail-storage.h    Wed Jul 25 14:08:43 2007 +0100
@@ -34,7 +34,9 @@ enum mail_storage_flags {
           fail to create the storage. */
        MAIL_STORAGE_FLAG_NO_AUTOCREATE         = 0x200,
        /* Rely on O_EXCL when creating dotlocks */
-       MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL      = 0x400
+       MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL      = 0x400,
+       /* Allow folder names to begin with '~' TILDE */
+       MAIL_STORAGE_FLAG_ALLOW_TILDE           = 0x800
 };
 
 enum mail_storage_lock_method {
diff -r a23be6956727 -r ab9cf3790ea9 src/master/mail-process.c
--- a/src/master/mail-process.c Tue Jul 24 05:48:03 2007 +0300
+++ b/src/master/mail-process.c Wed Jul 25 14:08:43 2007 +0100
@@ -254,6 +254,8 @@ mail_process_set_environment(struct sett
                env_put("DEBUG=1");
        if (set->mail_full_filesystem_access)
                env_put("FULL_FILESYSTEM_ACCESS=1");
+       if (set->mail_allow_tilde)
+               env_put("ALLOW_TILDE=1");
        if (set->pop3_no_flag_updates)
                env_put("POP3_NO_FLAG_UPDATES=1");
        if (set->pop3_reuse_xuidl)
diff -r a23be6956727 -r ab9cf3790ea9 src/master/master-settings-defs.c
--- a/src/master/master-settings-defs.c Tue Jul 24 05:48:03 2007 +0300
+++ b/src/master/master-settings-defs.c Wed Jul 25 14:08:43 2007 +0100
@@ -67,6 +67,7 @@ static struct setting_def setting_defs[]
        DEF(SET_INT, mailbox_idle_check_interval),
        DEF(SET_BOOL, mail_debug),
        DEF(SET_BOOL, mail_full_filesystem_access),
+       DEF(SET_BOOL, mail_allow_tilde),
        DEF(SET_INT, mail_max_keyword_length),
        DEF(SET_BOOL, mail_save_crlf),
        DEF(SET_BOOL, mail_read_mmaped),
diff -r a23be6956727 -r ab9cf3790ea9 src/master/master-settings.c
--- a/src/master/master-settings.c      Tue Jul 24 05:48:03 2007 +0300
+++ b/src/master/master-settings.c      Wed Jul 25 14:08:43 2007 +0100
@@ -216,6 +216,7 @@ struct settings default_settings = {
        MEMBER(mailbox_idle_check_interval) 30,
        MEMBER(mail_debug) FALSE,
        MEMBER(mail_full_filesystem_access) FALSE,
+       MEMBER(mail_allow_tilde) FALSE,
        MEMBER(mail_max_keyword_length) 50,
        MEMBER(mail_save_crlf) FALSE,
        MEMBER(mail_read_mmaped) FALSE,
diff -r a23be6956727 -r ab9cf3790ea9 src/master/master-settings.h
--- a/src/master/master-settings.h      Tue Jul 24 05:48:03 2007 +0300
+++ b/src/master/master-settings.h      Wed Jul 25 14:08:43 2007 +0100
@@ -75,6 +75,7 @@ struct settings {
        unsigned int mailbox_idle_check_interval;
        bool mail_debug;
        bool mail_full_filesystem_access;
+       bool mail_allow_tilde;
        unsigned int mail_max_keyword_length;
        bool mail_save_crlf;
        bool mail_read_mmaped;

Reply via email to