From 07defb0af7208f365de36245aaa26e75fddf3eba Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Mon, 2 Nov 2015 18:56:39 +0100
Subject: [PATCH] lib-sieve: imap4flags extension: Made flag manipulation API
 available to other extensions.

---
 src/lib-sieve/plugins/imap4flags/Makefile.am  |  8 ++-
 src/lib-sieve/plugins/imap4flags/cmd-flag.c   |  6 +--
 .../imap4flags/ext-imap4flags-common.c        | 35 ++++++++-----
 .../imap4flags/ext-imap4flags-common.h        | 21 +++-----
 .../plugins/imap4flags/sieve-ext-imap4flags.h | 50 +++++++++++++++++++
 .../plugins/imap4flags/tst-hasflag.c          |  4 +-
 6 files changed, 90 insertions(+), 34 deletions(-)
 create mode 100644 src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h

diff --git a/src/lib-sieve/plugins/imap4flags/Makefile.am b/src/lib-sieve/plugins/imap4flags/Makefile.am
index a511bacdc..e5390d472 100644
--- a/src/lib-sieve/plugins/imap4flags/Makefile.am
+++ b/src/lib-sieve/plugins/imap4flags/Makefile.am
@@ -22,6 +22,12 @@ libsieve_ext_imap4flags_la_SOURCES = \
 	ext-imap4flags.c \
 	ext-imapflags.c
 
+public_headers = \
+	sieve-ext-imap4flags.h
 
-noinst_HEADERS = \
+headers = \
 	ext-imap4flags-common.h
+
+pkginc_libdir=$(dovecot_pkgincludedir)/sieve
+pkginc_lib_HEADERS = $(public_headers)
+noinst_HEADERS = $(headers)
diff --git a/src/lib-sieve/plugins/imap4flags/cmd-flag.c b/src/lib-sieve/plugins/imap4flags/cmd-flag.c
index 63dce4015..1db774965 100644
--- a/src/lib-sieve/plugins/imap4flags/cmd-flag.c
+++ b/src/lib-sieve/plugins/imap4flags/cmd-flag.c
@@ -230,13 +230,13 @@ static int cmd_flag_operation_execute
 
 	if ( sieve_operation_is(op, setflag_operation) ) {
 		sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "setflag command");
-		flag_op = ext_imap4flags_set_flags;
+		flag_op = sieve_ext_imap4flags_set_flags;
 	} else if ( sieve_operation_is(op, addflag_operation) ) {
 		sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "addflag command");
-		flag_op = ext_imap4flags_add_flags;
+		flag_op = sieve_ext_imap4flags_add_flags;
 	} else if ( sieve_operation_is(op, removeflag_operation) ) {
 		sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "removeflag command");
-		flag_op = ext_imap4flags_remove_flags;
+		flag_op = sieve_ext_imap4flags_remove_flags;
 	} else {
 		i_unreached();
 	}
diff --git a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
index c7964ff46..d021f0e2e 100644
--- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
+++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
@@ -404,6 +404,11 @@ static void ext_imap4flags_iter_delete_last
 
 /* Flag operations */
 
+static string_t *ext_imap4flags_get_flag_variable
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index)
+	ATTR_NULL(2);
+
 static bool flags_list_flag_exists
 (string_t *flags_list, const char *flag)
 {
@@ -479,8 +484,8 @@ static void flags_list_clear_flags
 }
 
 static string_t *ext_imap4flags_get_flag_variable
-(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-	unsigned int var_index)
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index)
 {
 	string_t *flags;
 
@@ -504,9 +509,10 @@ static string_t *ext_imap4flags_get_flag_variable
 	return flags;
 }
 
-int ext_imap4flags_set_flags
-(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-	unsigned int var_index, struct sieve_stringlist *flags)
+int sieve_ext_imap4flags_set_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index,
+	struct sieve_stringlist *flags)
 {
 	string_t *cur_flags = ext_imap4flags_get_flag_variable
 		(renv, storage, var_index);
@@ -531,9 +537,10 @@ int ext_imap4flags_set_flags
 	return SIEVE_EXEC_BIN_CORRUPT;
 }
 
-int ext_imap4flags_add_flags
-(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-	unsigned int var_index, struct sieve_stringlist *flags)
+int sieve_ext_imap4flags_add_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index,
+	struct sieve_stringlist *flags)
 {
 	string_t *cur_flags = ext_imap4flags_get_flag_variable
 		(renv, storage, var_index);
@@ -557,9 +564,10 @@ int ext_imap4flags_add_flags
 	return SIEVE_EXEC_BIN_CORRUPT;
 }
 
-int ext_imap4flags_remove_flags
-(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-	unsigned int var_index, struct sieve_stringlist *flags)
+int sieve_ext_imap4flags_remove_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, 	unsigned int var_index,
+	struct sieve_stringlist *flags)
 {
 	string_t *cur_flags = ext_imap4flags_get_flag_variable
 		(renv, storage, var_index);
@@ -690,8 +698,9 @@ static void ext_imap4flags_stringlist_reset
 
 /* Flag access */
 
-struct sieve_stringlist *ext_imap4flags_get_flags
-(const struct sieve_runtime_env *renv, struct sieve_stringlist *flags_list)
+struct sieve_stringlist *sieve_ext_imap4flags_get_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_stringlist *flags_list)
 {
 	if ( flags_list == NULL )
 		return ext_imap4flags_stringlist_create_single
diff --git a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h
index 7399c5347..ac03d2f55 100644
--- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h
+++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h
@@ -9,6 +9,8 @@
 #include "sieve-common.h"
 #include "sieve-ext-variables.h"
 
+#include "sieve-ext-imap4flags.h"
+
 /*
  * Extension
  */
@@ -89,24 +91,13 @@ const char *ext_imap4flags_iter_get_flag
 /* Flag operations */
 
 typedef int (*ext_imapflag_flag_operation_t)
-	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, struct sieve_stringlist *flags);
-
-int ext_imap4flags_set_flags
-	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, struct sieve_stringlist *flags);
-int ext_imap4flags_add_flags
-	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, struct sieve_stringlist *flags);
-int ext_imap4flags_remove_flags
-	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, struct sieve_stringlist *flags);
+	(const struct sieve_runtime_env *renv,
+		struct sieve_variable_storage *storage,
+		unsigned int var_index, struct sieve_stringlist *flags)
+		ATTR_NULL(2);
 
 /* Flags access */
 
-struct sieve_stringlist *ext_imap4flags_get_flags
-	(const struct sieve_runtime_env *renv, struct sieve_stringlist *flags_list);
-
 void ext_imap4flags_get_implicit_flags_init
 	(struct ext_imap4flags_iter *iter, const struct sieve_extension *this_ext,
 		struct sieve_result *result);
diff --git a/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h
new file mode 100644
index 000000000..139699494
--- /dev/null
+++ b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h
@@ -0,0 +1,50 @@
+/* Copyright (c) 2002-2015 Pigeonhole authors, see the included COPYING file
+ */
+
+#ifndef __SIEVE_EXT_IMAP4FLAGS_H
+#define __SIEVE_EXT_IMAP4FLAGS_H
+
+struct sieve_variable_storage;
+
+/*
+ * Imap4flags extension
+ */
+
+/* FIXME: this is not suitable for future plugin support */
+
+extern const struct sieve_extension_def imap4flags_extension;
+
+static inline const struct sieve_extension *
+sieve_ext_imap4flags_require_extension
+(struct sieve_instance *svinst)
+{
+	return sieve_extension_require
+		(svinst, &imap4flags_extension, TRUE);
+}
+
+/*
+ * Flag manipulation
+ */
+
+int sieve_ext_imap4flags_set_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index,
+	struct sieve_stringlist *flags) ATTR_NULL(2);
+int sieve_ext_imap4flags_add_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, unsigned int var_index,
+	struct sieve_stringlist *flags) ATTR_NULL(2);
+int sieve_ext_imap4flags_remove_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_variable_storage *storage, 	unsigned int var_index,
+	struct sieve_stringlist *flags) ATTR_NULL(2);
+
+/*
+ * Flag retrieval
+ */
+
+struct sieve_stringlist *sieve_ext_imap4flags_get_flags
+(const struct sieve_runtime_env *renv,
+	struct sieve_stringlist *flags_list);
+
+#endif
diff --git a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
index 2b2858861..a95425110 100644
--- a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
@@ -225,11 +225,11 @@ static int tst_hasflag_operation_execute
 
 	sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "hasflag test");
 
-	value_list = ext_imap4flags_get_flags(renv, variables_list);
+	value_list = sieve_ext_imap4flags_get_flags(renv, variables_list);
 
 	if ( sieve_match_type_is(&mcht, is_match_type) ||
 		sieve_match_type_is(&mcht, contains_match_type) )
-		key_list = ext_imap4flags_get_flags(renv, flag_list);
+		key_list = sieve_ext_imap4flags_get_flags(renv, flag_list);
 	else
 		key_list = flag_list;
 
-- 
GitLab