From bc7f0da3ce3141e1be9b9cfdbbe9b7e7a53918f0 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Tue, 6 Mar 2018 23:11:32 +0100 Subject: [PATCH] lib-storage: mail-storage-settings: Pre-parse postmaster_address as an SMTP address. The pre-parsed address is not currently used anywhere, but this does check that the postmaster address can successfully be converted to an SMTP address, which is important for Pigeonhole. --- src/lib-storage/Makefile.am | 1 + src/lib-storage/mail-storage-settings.c | 45 +++++++++++++++++++------ src/lib-storage/mail-storage-settings.h | 5 +++ 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/lib-storage/Makefile.am b/src/lib-storage/Makefile.am index 256ceb7c4c..47b32f22a1 100644 --- a/src/lib-storage/Makefile.am +++ b/src/lib-storage/Makefile.am @@ -14,6 +14,7 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-settings \ -I$(top_srcdir)/src/lib-charset \ -I$(top_srcdir)/src/lib-mail \ + -I$(top_srcdir)/src/lib-smtp \ -I$(top_srcdir)/src/lib-imap \ -I$(top_srcdir)/src/lib-index \ -DPKG_RUNDIR=\""$(rundir)"\" \ diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 567456e645..1ad9fa6fc1 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -8,6 +8,7 @@ #include "hostpid.h" #include "settings-parser.h" #include "message-address.h" +#include "smtp-address.h" #include "mail-index.h" #include "mail-user.h" #include "mail-namespace.h" @@ -557,15 +558,17 @@ static bool mail_storage_settings_check(void *_set, pool_t pool, #ifndef CONFIG_BINARY static bool parse_postmaster_address(const char *address, pool_t pool, - const struct message_address **addr_r, - const char **error_r) + struct mail_storage_settings *set, + const char **error_r) ATTR_NULL(3) { struct message_address *addr; + struct smtp_address *smtp_addr; addr = message_address_parse(pool, (const unsigned char *)address, strlen(address), 2, FALSE); - if (addr == NULL || addr->domain == NULL || addr->invalid_syntax) { + if (addr == NULL || addr->domain == NULL || addr->invalid_syntax || + smtp_address_create_from_msg(pool, addr, &smtp_addr) < 0) { *error_r = t_strdup_printf( "invalid address `%s' specified for the " "postmaster_address setting", address); @@ -578,7 +581,10 @@ static bool parse_postmaster_address(const char *address, pool_t pool, } if (addr->name == NULL || *addr->name == '\0') addr->name = "Postmaster"; - *addr_r = addr; + if (set != NULL) { + set->_parsed_postmaster_address = addr; + set->_parsed_postmaster_address_smtp = smtp_addr; + } return TRUE; } @@ -590,8 +596,7 @@ static bool mail_storage_settings_expand_check(void *_set, /* Parse if possible. Perform error handling later. */ (void)parse_postmaster_address(set->postmaster_address, pool, - &set->_parsed_postmaster_address, - &error); + set, &error); return TRUE; } #endif @@ -730,6 +735,16 @@ static bool mail_user_settings_check(void *_set, pool_t pool ATTR_UNUSED, } /* */ +static void +get_postmaster_address_error(const struct mail_storage_settings *set, + const char **error_r) +{ + if (parse_postmaster_address(set->postmaster_address, + pool_datastack_create(), NULL, error_r)) + i_panic("postmaster_address='%s' parsing succeeded unexpectedly after it had already failed", + set->postmaster_address); +} + bool mail_storage_get_postmaster_address(const struct mail_storage_settings *set, const struct message_address **address_r, const char **error_r) @@ -737,12 +752,20 @@ bool mail_storage_get_postmaster_address(const struct mail_storage_settings *set *address_r = set->_parsed_postmaster_address; if (*address_r != NULL) return TRUE; + /* parsing failed - do it again to get the error */ + get_postmaster_address_error(set, error_r); + return FALSE; +} +bool mail_storage_get_postmaster_smtp(const struct mail_storage_settings *set, + const struct smtp_address **address_r, + const char **error_r) +{ + *address_r = set->_parsed_postmaster_address_smtp; + if (*address_r != NULL) + return TRUE; /* parsing failed - do it again to get the error */ - const struct message_address *addr; - if (parse_postmaster_address(set->postmaster_address, - pool_datastack_create(), &addr, error_r)) - i_panic("postmaster_address='%s' parsing succeeded unexpectedly after it had already failed", - set->postmaster_address); + get_postmaster_address_error(set, error_r); return FALSE; } + diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index 9ddae3beef..762e8d1186 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -10,6 +10,7 @@ struct mail_user; struct mail_namespace; struct mail_storage; struct message_address; +struct smtp_address; struct mail_storage_settings { const char *mail_location; @@ -74,6 +75,7 @@ struct mail_storage_settings { /* May be NULL - use mail_storage_get_postmaster_address() instead of directly accessing this. */ const struct message_address *_parsed_postmaster_address; + const struct smtp_address *_parsed_postmaster_address_smtp; const char *const *parsed_mail_attachment_content_type_filter; bool parsed_mail_attachment_exclude_inlined; @@ -164,5 +166,8 @@ mail_storage_get_dynamic_parsers(pool_t pool); bool mail_storage_get_postmaster_address(const struct mail_storage_settings *set, const struct message_address **address_r, const char **error_r); +bool mail_storage_get_postmaster_smtp(const struct mail_storage_settings *set, + const struct smtp_address **address_r, + const char **error_r); #endif