Skip to content

Commit

Permalink
lib-storage: mail-storage-settings: Pre-parse postmaster_address as a…
Browse files Browse the repository at this point in the history
…n 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.
  • Loading branch information
stephanbosch authored and villesavolainen committed Apr 16, 2018
1 parent 5bfc883 commit bc7f0da
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 11 deletions.
1 change: 1 addition & 0 deletions src/lib-storage/Makefile.am
Expand Up @@ -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)"\" \
Expand Down
45 changes: 34 additions & 11 deletions src/lib-storage/mail-storage-settings.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}

Expand All @@ -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
Expand Down Expand Up @@ -730,19 +735,37 @@ 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)
{
*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;
}

5 changes: 5 additions & 0 deletions src/lib-storage/mail-storage-settings.h
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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

0 comments on commit bc7f0da

Please sign in to comment.