]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail-storage-settings: Pre-parse postmaster_address as an SMTP address.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 6 Mar 2018 22:11:32 +0000 (23:11 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 16 Apr 2018 08:14:53 +0000 (11:14 +0300)
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
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h

index 256ceb7c4cdc6b50872f17c0fdb17b72a1c9ba1d..47b32f22a15cc4bd0de68598848c150f64a7198e 100644 (file)
@@ -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)"\" \
index 567456e64560b78e8e08ffe5b97ea8c720ab4e2a..1ad9fa6fc1ece0d0186927f733740af154b36451 100644 (file)
@@ -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,
 }
 /* </settings checks> */
 
+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;
 }
+
index 9ddae3beefeb8f112d32f904da33967774cbdac2..762e8d118662d681a4de2abd9b68dbe5235092fe 100644 (file)
@@ -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