From 742c8bf0de888868cb51f1a043fe59f8b9db1b38 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sat, 1 Aug 2009 22:28:50 +0200
Subject: [PATCH] Mailbox extension: finished implementation.

---
 .../plugins/mailbox/cmd-mailboxexists.c       | 43 +++++++++++++++----
 src/lib-sieve/plugins/mailbox/ext-mailbox.c   |  4 +-
 2 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/src/lib-sieve/plugins/mailbox/cmd-mailboxexists.c b/src/lib-sieve/plugins/mailbox/cmd-mailboxexists.c
index 94dc893bc..f838f3067 100644
--- a/src/lib-sieve/plugins/mailbox/cmd-mailboxexists.c
+++ b/src/lib-sieve/plugins/mailbox/cmd-mailboxexists.c
@@ -1,6 +1,10 @@
 /* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
  */
 
+#include "lib.h"
+#include "mail-storage.h"
+#include "mail-namespace.h"
+
 #include "sieve-common.h"
 #include "sieve-commands.h"
 #include "sieve-code.h"
@@ -106,7 +110,7 @@ static int tst_mailboxexists_operation_execute
 	const struct sieve_runtime_env *renv, sieve_size_t *address)
 {
 	struct sieve_coded_stringlist *mailbox_names;
-	string_t *uri_item;
+	string_t *mailbox_item;
 	bool result = TRUE, all_exist = TRUE;
 
 	/*
@@ -125,13 +129,36 @@ static int tst_mailboxexists_operation_execute
 
 	sieve_runtime_trace(renv, "MAILBOXEXISTS command");
 
-	uri_item = NULL;
-	while ( (result=sieve_coded_stringlist_next_item(mailbox_names, &uri_item)) 
-		&& uri_item != NULL ) {
-		
-		if ( TRUE ) {
-			all_exist = FALSE;
-			break;
+	if ( renv->scriptenv->namespaces != NULL ) {
+		mailbox_item = NULL;
+		while ( (result=sieve_coded_stringlist_next_item
+			(mailbox_names, &mailbox_item)) 
+			&& mailbox_item != NULL ) {
+			struct mail_namespace *ns;
+			struct mail_storage *storage;
+			const char *mailbox = str_c(mailbox_item);
+			struct mailbox *box;
+
+			/* Find the namespace */	
+			ns = mail_namespace_find(renv->scriptenv->namespaces, &mailbox);
+			if ( ns == NULL) {
+				all_exist = FALSE;
+				break;
+			}
+
+			/* Open the box */
+			storage = ns->storage;
+			box = mailbox_open(&storage, mailbox, NULL, MAILBOX_OPEN_FAST);
+			if ( box == NULL ) {
+				all_exist = FALSE;
+				break;
+			}
+
+			/* Also fail when it is readonly */
+			if ( mailbox_is_readonly(box) )
+				all_exist = FALSE;
+
+			mailbox_close(&box);
 		}
 	}
 	
diff --git a/src/lib-sieve/plugins/mailbox/ext-mailbox.c b/src/lib-sieve/plugins/mailbox/ext-mailbox.c
index c0fc6e8b4..3ea658802 100644
--- a/src/lib-sieve/plugins/mailbox/ext-mailbox.c
+++ b/src/lib-sieve/plugins/mailbox/ext-mailbox.c
@@ -6,8 +6,8 @@
  *
  * Authors: Stephan Bosch
  * Specification: RFC 5490
- * Implementation: skeleton
- * Status: under development
+ * Implementation: full
+ * Status: experimental, largely untested
  * 
  */
 
-- 
GitLab