dovecot-2.2-pigeonhole: lib-sieve: Created generic implementatio...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Wed Oct 21 21:35:06 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/637307bdbdf2
changeset: 2120:637307bdbdf2
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Wed Oct 21 23:27:36 2015 +0200
description:
lib-sieve: Created generic implementation for parsing an envelope_from setting, such as sieve_redirect_envelope_from.
Also adds a new source for the envelope_from address called "postmaster". This means that the value is obtained from the postmaster_address LDA setting.

diffstat:

 INSTALL                        |   9 ++--
 src/lib-sieve/cmd-redirect.c   |  22 ++++++-----
 src/lib-sieve/sieve-common.h   |  20 +++++++---
 src/lib-sieve/sieve-settings.c |  78 +++++++++++++++++++++++++----------------
 src/lib-sieve/sieve-settings.h |   4 ++
 5 files changed, 81 insertions(+), 52 deletions(-)

diffs (221 lines):

diff -r 9ff5fac3f7a8 -r 637307bdbdf2 INSTALL
--- a/INSTALL	Tue Oct 20 21:54:49 2015 +0200
+++ b/INSTALL	Wed Oct 21 23:27:36 2015 +0200
@@ -229,14 +229,15 @@
    appears to originate from the original sender. The following values are
    supported for this setting:
    
-     "sender"         - The sender address is used (default)
-     "recipient"      - The final recipient address is used
-     "orig_recipient" - The original recipient is used
+     "sender"         - The sender address is used (default).
+     "recipient"      - The final recipient address is used.
+     "orig_recipient" - The original recipient is used.
+     "postmaster"     - The postmaster_address configured for the LDA.
      "<user at domain>"  - Redirected messages are always sent from user at domain.
                         The angle brackets are mandatory. The null "<>" address
                         is also supported.
 
-	 When the envelope sender of the processed message is the null address "<>",
+   When the envelope sender of the processed message is the null address "<>",
    the envelope sender of the redirected message is also always "<>",
    irrespective of what is configured for this setting. 
 
diff -r 9ff5fac3f7a8 -r 637307bdbdf2 src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c	Tue Oct 20 21:54:49 2015 +0200
+++ b/src/lib-sieve/cmd-redirect.c	Wed Oct 21 23:27:36 2015 +0200
@@ -317,8 +317,8 @@
 	const struct sieve_script_env *senv = aenv->scriptenv;
 	const char *sender = sieve_message_get_sender(msgctx);
 	const char *recipient = sieve_message_get_final_recipient(msgctx);
-	enum sieve_redirect_envelope_from env_from =
-		aenv->svinst->redirect_from;
+	struct sieve_mail_sender *env_from =
+		&aenv->svinst->redirect_from;
 	struct istream *input;
 	struct ostream *output;
 	const char *error;
@@ -350,20 +350,22 @@
 		 when then returns a delivery status notification that also ends up
 		 being redirected to the same invalid address.
 	 */
-	if ( sender != NULL &&
-		env_from != SIEVE_REDIRECT_ENVELOPE_FROM_SENDER ) {
-		switch ( env_from ) {
-		case SIEVE_REDIRECT_ENVELOPE_FROM_RECIPIENT:
+	if ( sender != NULL ) {
+		switch ( env_from->source ) {
+		case SIEVE_MAIL_SENDER_SOURCE_RECIPIENT:
 			sender = sieve_message_get_final_recipient(msgctx);
 			break;
-		case SIEVE_REDIRECT_ENVELOPE_FROM_ORIG_RECIPIENT:
+		case SIEVE_MAIL_SENDER_SOURCE_ORIG_RECIPIENT:
 			sender = sieve_message_get_orig_recipient(msgctx);
 			break;
-		case SIEVE_REDIRECT_ENVELOPE_FROM_EXPLICIT:
-			sender = aenv->svinst->redirect_from_explicit;
+		case SIEVE_MAIL_SENDER_SOURCE_POSTMASTER:
+			sender = senv->postmaster_address;
+			break;
+		case SIEVE_MAIL_SENDER_SOURCE_EXPLICIT:
+			sender = env_from->address;
 			break;
 		default:
-			i_unreached();
+			break;
 		}
 	}
 
diff -r 9ff5fac3f7a8 -r 637307bdbdf2 src/lib-sieve/sieve-common.h
--- a/src/lib-sieve/sieve-common.h	Tue Oct 20 21:54:49 2015 +0200
+++ b/src/lib-sieve/sieve-common.h	Wed Oct 21 23:27:36 2015 +0200
@@ -21,11 +21,18 @@
 
 #define SIEVE_MAX_NUMBER ((sieve_number_t) -1)
 
-enum sieve_redirect_envelope_from {
-	SIEVE_REDIRECT_ENVELOPE_FROM_SENDER,
-	SIEVE_REDIRECT_ENVELOPE_FROM_RECIPIENT,
-	SIEVE_REDIRECT_ENVELOPE_FROM_ORIG_RECIPIENT,
-	SIEVE_REDIRECT_ENVELOPE_FROM_EXPLICIT
+enum sieve_mail_sender_source {
+	SIEVE_MAIL_SENDER_SOURCE_DEFAULT = 0,
+	SIEVE_MAIL_SENDER_SOURCE_SENDER,
+	SIEVE_MAIL_SENDER_SOURCE_RECIPIENT,
+	SIEVE_MAIL_SENDER_SOURCE_ORIG_RECIPIENT,
+	SIEVE_MAIL_SENDER_SOURCE_POSTMASTER,
+	SIEVE_MAIL_SENDER_SOURCE_EXPLICIT
+};
+
+struct sieve_mail_sender {
+	enum sieve_mail_sender_source source;
+	const char *address;
 };
 
 /*
@@ -206,8 +213,7 @@
 	size_t max_script_size;
 	unsigned int max_actions;
 	unsigned int max_redirects;
-	enum sieve_redirect_envelope_from redirect_from;
-	const char *redirect_from_explicit;
+	struct sieve_mail_sender redirect_from;
 };
 
 #endif /* __SIEVE_COMMON_H */
diff -r 9ff5fac3f7a8 -r 637307bdbdf2 src/lib-sieve/sieve-settings.c
--- a/src/lib-sieve/sieve-settings.c	Tue Oct 20 21:54:49 2015 +0200
+++ b/src/lib-sieve/sieve-settings.c	Wed Oct 21 23:27:36 2015 +0200
@@ -217,6 +217,48 @@
 	return TRUE;
 }
 
+bool sieve_setting_get_mail_sender_value
+(struct sieve_instance *svinst, pool_t pool, const char *setting,
+	struct sieve_mail_sender *sender)
+{
+	const char *str_value;
+	size_t set_len;
+
+	str_value = sieve_setting_get(svinst, setting);
+	if ( str_value == NULL )
+		return FALSE;
+
+	str_value = t_str_trim(str_value);
+	str_value = t_str_lcase(str_value);
+	set_len = strlen(str_value);
+	if ( set_len > 0 ) {
+		if ( strcmp(str_value, "default") == 0 ) {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_DEFAULT;
+		} else if ( strcmp(str_value, "sender") == 0 ) {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_SENDER;
+		} else if ( strcmp(str_value, "recipient") == 0 ) {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_RECIPIENT;
+		} else if ( strcmp(str_value, "orig_recipient") == 0 ) {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_ORIG_RECIPIENT;
+		} else if ( strcmp(str_value, "postmaster") == 0 ) {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_POSTMASTER;
+		} else if ( str_value[0] == '<' &&	str_value[set_len-1] == '>') {
+			sender->source = SIEVE_MAIL_SENDER_SOURCE_EXPLICIT;
+
+			str_value = t_str_trim(t_strndup(str_value+1, set_len-2));
+			sender->address = NULL;
+			if ( *str_value != '\0' )
+				sender->address = p_strdup(pool, str_value);
+		} else {
+			sieve_sys_warning(svinst,
+				"Invalid value for setting '%s': '%s'", setting,
+				str_value);
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
 /*
  * Main Sieve engine settings
  */
@@ -226,7 +268,6 @@
 {
 	unsigned long long int uint_setting;
 	size_t size_setting;
-	const char *str_setting;
 
 	svinst->max_script_size = SIEVE_DEFAULT_MAX_SCRIPT_SIZE;
 	if ( sieve_setting_get_size_value
@@ -246,36 +287,11 @@
 		svinst->max_redirects = (unsigned int) uint_setting;
 	}
 
-	svinst->redirect_from = SIEVE_REDIRECT_ENVELOPE_FROM_SENDER;
-	svinst->redirect_from_explicit = NULL;
-	if ( (str_setting=sieve_setting_get
-		(svinst, "sieve_redirect_envelope_from")) != NULL ) {
-		size_t set_len;
-
-		str_setting = t_str_trim(str_setting);
-		str_setting = t_str_lcase(str_setting);
-		set_len = strlen(str_setting);
-		if ( set_len > 0 ) {
-			if ( strcmp(str_setting, "sender") == 0 ) {
-				svinst->redirect_from = SIEVE_REDIRECT_ENVELOPE_FROM_SENDER;
-			} else if ( strcmp(str_setting, "recipient") == 0 ) {
-				svinst->redirect_from = SIEVE_REDIRECT_ENVELOPE_FROM_RECIPIENT;
-			} else if ( strcmp(str_setting, "orig_recipient") == 0 ) {
-				svinst->redirect_from = SIEVE_REDIRECT_ENVELOPE_FROM_ORIG_RECIPIENT;
-			} else if ( str_setting[0] == '<' &&	str_setting[set_len-1] == '>') {
-				svinst->redirect_from = SIEVE_REDIRECT_ENVELOPE_FROM_EXPLICIT;
-
-				str_setting = t_str_trim(t_strndup(str_setting+1, set_len-2));
-				if ( *str_setting != '\0' ) {
-					svinst->redirect_from_explicit =
-						p_strdup(svinst->pool, str_setting);
-				}
-			} else {
-				sieve_sys_warning(svinst,
-					"Invalid value `%s' for sieve_redirect_envelope_from setting",
-					str_setting);
-			}
-		}
+	if (!sieve_setting_get_mail_sender_value
+		(svinst, svinst->pool, "sieve_redirect_envelope_from",
+			&svinst->redirect_from)) {
+		svinst->redirect_from.source =
+			SIEVE_MAIL_SENDER_SOURCE_DEFAULT;
 	}
 }
 
diff -r 9ff5fac3f7a8 -r 637307bdbdf2 src/lib-sieve/sieve-settings.h
--- a/src/lib-sieve/sieve-settings.h	Tue Oct 20 21:54:49 2015 +0200
+++ b/src/lib-sieve/sieve-settings.h	Wed Oct 21 23:27:36 2015 +0200
@@ -37,6 +37,10 @@
 	(struct sieve_instance *svinst, const char *setting,
 		sieve_number_t *value_r);
 
+bool sieve_setting_get_mail_sender_value
+	(struct sieve_instance *svinst, pool_t pool, const char *setting,
+		struct sieve_mail_sender *sender);
+
 /*
  * Main Sieve engine settings
  */


More information about the dovecot-cvs mailing list