Mercurial > dovecot > original-hg > dovecot-1.2
changeset 1252:61decb945930 HEAD
Use less strict mailbox name verification when trying to access existing
mailboxes. Don't delete directories beginning with ".." outside our maildir
root (if full_filesystem_access = yes).
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 25 Feb 2003 00:56:15 +0200 |
parents | 53f8ac273a9b |
children | 39b899338c99 |
files | src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/mbox/mbox-storage.c |
diffstat | 2 files changed, 53 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-storage.c Tue Feb 25 00:39:44 2003 +0200 +++ b/src/lib-storage/index/maildir/maildir-storage.c Tue Feb 25 00:56:15 2003 +0200 @@ -98,7 +98,8 @@ S_ISDIR(st.st_mode); } -static int maildir_is_valid_name(struct mail_storage *storage, const char *name) +static int maildir_is_valid_create_name(struct mail_storage *storage, + const char *name) { if (name[0] == '\0' || name[strlen(name)-1] == storage->hierarchy_sep || strchr(name, '*') != NULL || strchr(name, '%') != NULL) @@ -111,6 +112,18 @@ strchr(name, '/') == NULL && strchr(name, '\\') == NULL; } +static int maildir_is_valid_existing_name(const char *name) +{ + if (name[0] == '\0' || name[0] == '.') + return FALSE; + + if (full_filesystem_access) + return TRUE; + + return *name != '~' && + strchr(name, '/') == NULL && strchr(name, '\\') == NULL; +} + static const char *maildir_get_absolute_path(const char *name) { const char *p; @@ -259,7 +272,7 @@ return maildir_open(storage, "INBOX", readonly, fast); } - if (!maildir_is_valid_name(storage, name)) { + if (!maildir_is_valid_existing_name(name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -292,7 +305,7 @@ mail_storage_clear_error(storage); name = inbox_fix_case(storage, name); - if (!maildir_is_valid_name(storage, name)) { + if (!maildir_is_valid_create_name(storage, name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -325,7 +338,7 @@ return FALSE; } - if (!maildir_is_valid_name(storage, name)) { + if (!maildir_is_valid_existing_name(name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -463,8 +476,8 @@ mail_storage_clear_error(storage); oldname = inbox_fix_case(storage, oldname); - if (!maildir_is_valid_name(storage, oldname) || - !maildir_is_valid_name(storage, newname)) { + if (!maildir_is_valid_existing_name(oldname) || + !maildir_is_valid_create_name(storage, newname)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -519,7 +532,7 @@ mail_storage_clear_error(storage); name = inbox_fix_case(storage, name); - if (!maildir_is_valid_name(storage, name)) { + if (!maildir_is_valid_existing_name(name)) { *status = MAILBOX_NAME_INVALID; return TRUE; } @@ -528,7 +541,14 @@ if (stat(path, &st) == 0) { *status = MAILBOX_NAME_EXISTS; return TRUE; - } else if (errno == ENOENT) { + } + + if (!maildir_is_valid_create_name(storage, name)) { + *status = MAILBOX_NAME_INVALID; + return TRUE; + } + + if (errno == ENOENT) { *status = MAILBOX_NAME_VALID; return TRUE; } else {
--- a/src/lib-storage/index/mbox/mbox-storage.c Tue Feb 25 00:39:44 2003 +0200 +++ b/src/lib-storage/index/mbox/mbox-storage.c Tue Feb 25 00:56:15 2003 +0200 @@ -245,13 +245,22 @@ return TRUE; } -static int mbox_is_valid_name(struct mail_storage *storage, const char *name) +static int mbox_is_valid_create_name(struct mail_storage *storage, + const char *name) { if (name[0] == '\0' || name[strlen(name)-1] == storage->hierarchy_sep || strchr(name, '*') != NULL || strchr(name, '%') != NULL) return FALSE; - return full_filesystem_access || mbox_is_valid_mask(name); + return mbox_is_valid_mask(name); +} + +static int mbox_is_valid_existing_name(const char *name) +{ + if (name[0] == '\0') + return FALSE; + + return mbox_is_valid_mask(name); } static const char *mbox_get_index_dir(struct mail_storage *storage, @@ -371,7 +380,7 @@ return mbox_open(storage, "INBOX", readonly, fast); } - if (!mbox_is_valid_name(storage, name)) { + if (!mbox_is_valid_existing_name(name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -410,7 +419,7 @@ if (strcasecmp(name, "INBOX") == 0) name = "INBOX"; - if (!mbox_is_valid_name(storage, name)) { + if (!mbox_is_valid_create_name(storage, name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -473,7 +482,7 @@ return FALSE; } - if (!mbox_is_valid_name(storage, name)) { + if (!mbox_is_valid_existing_name(name)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -539,8 +548,8 @@ mail_storage_clear_error(storage); - if (!mbox_is_valid_name(storage, oldname) || - !mbox_is_valid_name(storage, newname)) { + if (!mbox_is_valid_existing_name(oldname) || + !mbox_is_valid_create_name(storage, newname)) { mail_storage_set_error(storage, "Invalid mailbox name"); return FALSE; } @@ -597,7 +606,7 @@ if (strcasecmp(name, "INBOX") == 0) name = "INBOX"; - if (!mbox_is_valid_name(storage, name)) { + if (!mbox_is_valid_existing_name(name)) { *status = MAILBOX_NAME_INVALID; return TRUE; } @@ -606,7 +615,14 @@ if (stat(path, &st) == 0) { *status = MAILBOX_NAME_EXISTS; return TRUE; - } else if (errno == ENOENT) { + } + + if (!mbox_is_valid_create_name(storage, name)) { + *status = MAILBOX_NAME_INVALID; + return TRUE; + } + + if (errno == ENOENT) { *status = MAILBOX_NAME_VALID; return TRUE; } else if (errno == ENOTDIR) {