From 3303afff99651a83ba64ea2b47641687d0b3eaca Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Thu, 29 Aug 2024 14:17:54 +0300 Subject: [PATCH] lda: Use new var_expand --- src/lib-lda/lda-settings.c | 20 +++++++++++++++---- src/lib-lda/lda-settings.h | 3 +++ src/lib-lda/mail-deliver.c | 41 +++++++++++++++++++------------------- src/lib-lda/mail-send.c | 25 ++++++++++++----------- 4 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/lib-lda/lda-settings.c b/src/lib-lda/lda-settings.c index 4b57a1c50f..719de94262 100644 --- a/src/lib-lda/lda-settings.c +++ b/src/lib-lda/lda-settings.c @@ -6,6 +6,7 @@ #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); @@ -29,10 +30,10 @@ static const struct setting_define lda_setting_defines[] = { 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, @@ -54,11 +55,22 @@ const struct setting_parser_info lda_setting_parser_info = { }; 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; } diff --git a/src/lib-lda/lda-settings.h b/src/lib-lda/lda-settings.h index 82f766883f..9a956ba199 100644 --- a/src/lib-lda/lda-settings.h +++ b/src/lib-lda/lda-settings.h @@ -15,6 +15,9 @@ struct lda_settings { 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; diff --git a/src/lib-lda/mail-deliver.c b/src/lib-lda/mail-deliver.c index e5820c676e..1f45c3aba4 100644 --- a/src/lib-lda/mail-deliver.c +++ b/src/lib-lda/mail-deliver.c @@ -7,7 +7,7 @@ #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" @@ -163,19 +163,19 @@ mail_deliver_ctx_get_log_var_expand_table(struct mail_deliver_context *ctx, &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)); } @@ -184,7 +184,6 @@ void mail_deliver_log(struct mail_deliver_context *ctx, const char *fmt, ...) { va_list args; string_t *str; - const struct var_expand_table *tab; const char *msg, *error; if (*ctx->set->deliver_log_format == '\0') @@ -194,9 +193,12 @@ void mail_deliver_log(struct mail_deliver_context *ctx, const char *fmt, ...) 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); @@ -585,8 +587,7 @@ int mail_deliver(struct mail_deliver_context *ctx, 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; diff --git a/src/lib-lda/mail-send.c b/src/lib-lda/mail-send.c index 21b5ad7819..b9c59346db 100644 --- a/src/lib-lda/mail-send.c +++ b/src/lib-lda/mail-send.c @@ -7,7 +7,7 @@ #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" @@ -33,11 +33,10 @@ get_var_expand_table(struct mail *mail, 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; @@ -59,7 +58,6 @@ int mail_send_rejection(struct mail_deliver_context *ctx, 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; @@ -95,7 +93,10 @@ int mail_send_rejection(struct mail_deliver_context *ctx, 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); @@ -119,8 +120,8 @@ int mail_send_rejection(struct mail_deliver_context *ctx, 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); @@ -137,8 +138,8 @@ int mail_send_rejection(struct mail_deliver_context *ctx, 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); -- 2.47.3