]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lda: Use new var_expand
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 29 Aug 2024 11:17:54 +0000 (14:17 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:14 +0000 (12:34 +0200)
src/lib-lda/lda-settings.c
src/lib-lda/lda-settings.h
src/lib-lda/mail-deliver.c
src/lib-lda/mail-send.c

index 4b57a1c50f1430c52eb5b5ad87da2baaad85021b..719de9426274b94643ebf777e7cbc2c94b004362 100644 (file)
@@ -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;
 }
index 82f766883fdab4441e4ce3a6d9c141d443a519d2..9a956ba1994cc3ebacbbc945c2dada0dfd725a5b 100644 (file)
@@ -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;
index e5820c676e01f23de9240a42893778d4e25697a4..1f45c3aba4b6fa4c97532a3eef10a86f34878190 100644 (file)
@@ -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,
+                          &params, &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;
 
index 21b5ad7819e67ee8825b804c35b4e4fc87c92162..b9c59346dbcaf6b11761fa45fe992be010bc2be4 100644 (file)
@@ -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,
+                          &params, &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,
+                          &params, &error) < 0) {
                e_error(ctx->event,
                        "Failed to expand rejection_reason=%s: %s",
                        ctx->set->rejection_reason, error);