changeset 9320:0463fc241aae HEAD

listescape: Don't escape characters in namespace prefixes.
author Timo Sirainen <tss@iki.fi>
date Thu, 13 Aug 2009 20:21:21 -0400
parents 22b45d08cd4e
children 339be408f49a
files src/plugins/listescape/listescape-plugin.c
diffstat 1 files changed, 31 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/listescape/listescape-plugin.c	Thu Aug 13 18:32:49 2009 -0400
+++ b/src/plugins/listescape/listescape-plugin.c	Thu Aug 13 20:21:21 2009 -0400
@@ -44,10 +44,23 @@
 static MODULE_CONTEXT_DEFINE_INIT(listescape_list_module,
 				  &mailbox_list_module_register);
 
-static const char *list_escape(struct mail_namespace *ns,
-			       const char *str, bool change_sep)
+static const char *
+list_escape(struct mail_namespace *ns, const char *str, bool vname)
 {
 	string_t *esc = t_str_new(64);
+	unsigned int i;
+
+	for (i = 0; str[i] != '\0'; i++) {
+		if (str[i] == '*' || str[i] == '%')
+			break;
+	}
+	if (i > ns->prefix_len)
+		i = ns->prefix_len;
+
+	if (vname && i > 0 && strncmp(ns->prefix, str, i) == 0) {
+		str_append_n(esc, str, i);
+		str += i;
+	}
 
 	if (*str == '~') {
 		str_printfa(esc, "%c%02x", escape_char, *str);
@@ -55,7 +68,7 @@
 	}
 	for (; *str != '\0'; str++) {
 		if (*str == ns->sep) {
-			if (change_sep)
+			if (!vname)
 				str_append_c(esc, ns->list->hierarchy_sep);
 			else
 				str_append_c(esc, *str);
@@ -104,18 +117,18 @@
 	struct mailbox_list_iterate_context *ctx;
 	const char **escaped_patterns;
 	unsigned int i;
-	bool change_sep;
+	bool vname;
 
 	/* this is kind of kludgy. In ACL code we want to convert patterns,
 	   in maildir renaming code we don't. so for now just use the _RAW_LIST
 	   flag.. */
 	if ((flags & MAILBOX_LIST_ITER_RAW_LIST) == 0) {
-		change_sep = (flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) == 0;
+		vname = (flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0;
 		escaped_patterns = t_new(const char *,
 					 str_array_length(patterns) + 1);
 		for (i = 0; patterns[i] != NULL; i++) {
 			escaped_patterns[i] =
-				list_escape(list->ns, patterns[i], change_sep);
+				list_escape(list->ns, patterns[i], vname);
 		}
 		patterns = escaped_patterns;
 	}
@@ -144,7 +157,9 @@
 		return info;
 
 	str_truncate(mlist->list_name, 0);
-	list_unescape_str(ctx->list->ns, info->name, mlist->list_name);
+	str_append(mlist->list_name, ctx->list->ns->prefix);
+	list_unescape_str(ctx->list->ns, info->name + ctx->list->ns->prefix_len,
+			  mlist->list_name);
 	mlist->info = *info;
 	mlist->info.name = str_c(mlist->list_name);
 	return &mlist->info;
@@ -174,7 +189,7 @@
 		LIST_ESCAPE_LIST_CONTEXT(storage->list);
 
 	if (!mlist->name_escaped)
-		name = list_escape(storage->ns, name, TRUE);
+		name = list_escape(storage->ns, name, FALSE);
 	return mstorage->module_ctx.super.
 		mailbox_open(storage, name, input, flags);
 }
@@ -186,7 +201,7 @@
 	struct listescape_mail_storage *mstorage =
 		LIST_ESCAPE_CONTEXT(storage);
 
-	name = list_escape(storage->ns, name, TRUE);
+	name = list_escape(storage->ns, name, FALSE);
 	return mstorage->module_ctx.super.
 		mailbox_create(storage, name, directory);
 }
@@ -198,7 +213,7 @@
 	int ret;
 
 	/* at least quota plugin opens the mailbox when deleting it */
-	name = list_escape(list->ns, name, TRUE);
+	name = list_escape(list->ns, name, FALSE);
 	mlist->name_escaped = TRUE;
 	ret = mlist->module_ctx.super.delete_mailbox(list, name);
 	mlist->name_escaped = FALSE;
@@ -211,8 +226,8 @@
 {
 	struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
 
-	oldname = list_escape(list->ns, oldname, TRUE);
-	newname = list_escape(list->ns, newname, TRUE);
+	oldname = list_escape(list->ns, oldname, FALSE);
+	newname = list_escape(list->ns, newname, FALSE);
 	return mlist->module_ctx.super.rename_mailbox(list, oldname, newname);
 }
 
@@ -221,7 +236,7 @@
 {
 	struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
 
-	name = list_escape(list->ns, name, TRUE);
+	name = list_escape(list->ns, name, FALSE);
 	return mlist->module_ctx.super.set_subscribed(list, name, set);
 }
 
@@ -231,7 +246,7 @@
 {
 	struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
 
-	name = list_escape(list->ns, name, TRUE);
+	name = list_escape(list->ns, name, FALSE);
 	return mlist->module_ctx.super.
 		get_mailbox_name_status(list, name, status);
 }
@@ -241,7 +256,7 @@
 {
 	struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
 
-	name = list_escape(list->ns, name, TRUE);
+	name = list_escape(list->ns, name, FALSE);
 	return mlist->module_ctx.super.is_valid_existing_name(list, name);
 }
 
@@ -250,7 +265,7 @@
 {
 	struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
 
-	name = list_escape(list->ns, name, TRUE);
+	name = list_escape(list->ns, name, FALSE);
 	return mlist->module_ctx.super.is_valid_create_name(list, name);
 }