#include "mail-storage-settings.h"
#include "smtp-submit-settings.h"
#include "lda-settings.h"
+#include "var-expand-new.h"
static bool lda_settings_check(void *_set, pool_t pool, const char **error_r);
static const struct lda_settings lda_default_settings = {
.hostname = "",
- .rejection_subject = "Rejected: %s",
+ .rejection_subject = "Rejected: %{subject}",
.rejection_reason =
- "Your message to <%t> was automatically rejected:%n%r",
- .deliver_log_format = "msgid=%m: %$",
+ "Your message to <%{to}> was automatically rejected:%{literal('\\r\\n')}%{reason}",
+ .deliver_log_format = "msgid=%{msgid}: %{message}",
.recipient_delimiter = "+",
.lda_original_recipient_header = "",
.quota_full_tempfail = FALSE,
};
static bool lda_settings_check(void *_set, pool_t pool,
- const char **error_r ATTR_UNUSED)
+ const char **error_r)
{
struct lda_settings *set = _set;
+ struct var_expand_program *prog;
+ const char *error;
if (*set->hostname == '\0')
set->hostname = p_strdup(pool, my_hostdomain());
+
+ if (var_expand_program_create(set->deliver_log_format, &prog, &error) < 0) {
+ *error_r = t_strdup_printf("Invalid deliver_log_format: %s", error);
+ return FALSE;
+ }
+ const char *const *vars = var_expand_program_variables(prog);
+ set->parsed_want_storage_id = str_array_find(vars, "storage_id");
+ var_expand_program_free(&prog);
+
return TRUE;
}
bool quota_full_tempfail;
bool lda_mailbox_autocreate;
bool lda_mailbox_autosubscribe;
+
+ /* generated */
+ bool parsed_want_storage_id;
};
extern const struct setting_parser_info lda_setting_parser_info;
#include "str-sanitize.h"
#include "time-util.h"
#include "unichar.h"
-#include "var-expand.h"
+#include "var-expand-new.h"
#include "message-address.h"
#include "smtp-address.h"
#include "lda-settings.h"
&ctx->delivery_time_started);
const struct var_expand_table stack_tab[] = {
- { '$', message, NULL },
- { 'm', ctx->fields.message_id != NULL ?
- ctx->fields.message_id : "unspecified", "msgid" },
- { 's', ctx->fields.subject, "subject" },
- { 'f', ctx->fields.from, "from" },
- { 'e', ctx->fields.from_envelope, "from_envelope" },
- { 'p', dec2str(ctx->fields.psize), "size" },
- { 'w', dec2str(ctx->fields.vsize), "vsize" },
- { '\0', dec2str(delivery_time_msecs), "delivery_time" },
- { '\0', dec2str(ctx->session_time_msecs), "session_time" },
- { '\0', smtp_address_encode(ctx->rcpt_params.orcpt.addr), "to_envelope" },
- { '\0', ctx->fields.storage_id, "storage_id" },
- { '\0', NULL, NULL }
+ { .key = "message", .value = message },
+ { .key = "msgid", .value = ctx->fields.message_id != NULL ?
+ ctx->fields.message_id : "unspecified" },
+ { .key = "subject", .value = ctx->fields.subject },
+ { .key = "from", .value = ctx->fields.from },
+ { .key = "from_envelope", .value = ctx->fields.from_envelope },
+ { .key = "size", .value = dec2str(ctx->fields.psize) },
+ { .key = "vsize", .value = dec2str(ctx->fields.vsize) },
+ { .key = "delivery_time", .value = dec2str(delivery_time_msecs) },
+ { .key = "session_time", .value = dec2str(ctx->session_time_msecs) },
+ { .key = "to_envelope", .value = smtp_address_encode(ctx->rcpt_params.orcpt.addr) },
+ { .key = "storage_id", .value = ctx->fields.storage_id },
+ VAR_EXPAND_TABLE_END
};
return p_memdup(unsafe_data_stack_pool, stack_tab, sizeof(stack_tab));
}
{
va_list args;
string_t *str;
- const struct var_expand_table *tab;
const char *msg, *error;
if (*ctx->set->deliver_log_format == '\0')
msg = t_strdup_vprintf(fmt, args);
str = t_str_new(256);
- tab = mail_deliver_ctx_get_log_var_expand_table(ctx, msg);
- if (var_expand_with_table(str, ctx->set->deliver_log_format,
- tab, &error) <= 0) {
+ const struct var_expand_params params = {
+ .table = mail_deliver_ctx_get_log_var_expand_table(ctx, msg),
+ .event = ctx->event,
+ };
+ if (var_expand_new(str, ctx->set->deliver_log_format,
+ ¶ms, &error) < 0) {
e_error(ctx->event,
"Failed to expand deliver_log_format=%s: %s",
ctx->set->deliver_log_format, error);
mail_deliver_fields_update(&ctx->fields, ctx->pool, ctx->src_mail);
mail_deliver_update_event(ctx);
- muser->want_storage_id =
- var_has_key(ctx->set->deliver_log_format, '\0', "storage_id");
+ muser->want_storage_id = ctx->set->parsed_want_storage_id;
muser->deliver_ctx = ctx;
#include "ostream.h"
#include "str.h"
#include "str-sanitize.h"
-#include "var-expand.h"
+#include "var-expand-new.h"
#include "message-date.h"
#include "message-size.h"
#include "message-address.h"
subject = "";
const struct var_expand_table stack_tab[] = {
- { 'n', "\r\n", "crlf" },
- { 'r', reason, "reason" },
- { 's', str_sanitize(subject, 80), "subject" },
- { 't', smtp_address_encode(recipient), "to" },
- { '\0', NULL, NULL }
+ { .key = "reason", .value = reason },
+ { .key = "subject", .value = str_sanitize(subject, 80) },
+ { .key = "to", .value = smtp_address_encode(recipient) },
+ VAR_EXPAND_TABLE_END
};
struct var_expand_table *tab;
const struct message_address *postmaster_addr;
const struct smtp_address *return_addr;
const char *hdr, *value, *msgid, *orig_msgid, *boundary, *error;
- const struct var_expand_table *vtable;
string_t *str;
int ret;
smtp_address_encode(return_addr),
str_sanitize(reason, 512));
- vtable = get_var_expand_table(mail, recipient, reason);
+ const struct var_expand_params params = {
+ .table = get_var_expand_table(mail, recipient, reason),
+ .event = ctx->event,
+ };
i_zero(&smtp_input);
smtp_submit = smtp_submit_init_simple(&smtp_input, ctx->smtp_set, NULL);
ctx->dsn ? "delivery-status" : "disposition-notification",
boundary);
str_append(str, "Subject: ");
- if (var_expand_with_table(str, ctx->set->rejection_subject,
- vtable, &error) <= 0) {
+ if (var_expand_new(str, ctx->set->rejection_subject,
+ ¶ms, &error) < 0) {
e_error(ctx->event,
"Failed to expand rejection_subject=%s: %s",
ctx->set->rejection_subject, error);
str_append(str, "Content-Disposition: inline\r\n");
str_append(str, "Content-Transfer-Encoding: 8bit\r\n\r\n");
- if (var_expand_with_table(str, ctx->set->rejection_reason,
- vtable, &error) <= 0) {
+ if (var_expand_new(str, ctx->set->rejection_reason,
+ ¶ms, &error) < 0) {
e_error(ctx->event,
"Failed to expand rejection_reason=%s: %s",
ctx->set->rejection_reason, error);