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) {