X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/d4c9963ace2b653f657c74abecfecb7546c722b1..38965d80d70cacd0c944d32f7107549a3a272b35:/src/src/routers/redirect.c diff --git a/src/src/routers/redirect.c b/src/src/routers/redirect.c index 0090ddaed..37b5f5e24 100644 --- a/src/src/routers/redirect.c +++ b/src/src/routers/redirect.c @@ -2,12 +2,15 @@ * Exim - an Internet mail transport agent * *************************************************/ +/* Copyright (c) The Exim Maintainers 2020 - 2022 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ -/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ #include "../exim.h" + +#ifdef ROUTER_REDIRECT /* Remainder of file */ #include "rf_functions.h" #include "redirect.h" @@ -93,13 +96,6 @@ optionlist redirect_router_options[] = { { "sieve_useraddress", opt_stringptr, LOFF(sieve_useraddress) }, { "sieve_vacation_directory", opt_stringptr, LOFF(sieve_vacation_directory) }, { "skip_syntax_errors", opt_bool, LOFF(skip_syntax_errors) }, -#ifdef EXPERIMENTAL_SRS_ALT - { "srs", opt_stringptr, LOFF(srs) }, - { "srs_alias", opt_stringptr, LOFF(srs_alias) }, - { "srs_condition", opt_stringptr, LOFF(srs_condition) }, - { "srs_dbinsert", opt_stringptr, LOFF(srs_dbinsert) }, - { "srs_dbselect", opt_stringptr, LOFF(srs_dbselect) }, -#endif { "syntax_errors_text", opt_stringptr, LOFF(syntax_errors_text) }, { "syntax_errors_to", opt_stringptr, LOFF(syntax_errors_to) } }; @@ -149,13 +145,6 @@ redirect_router_options_block redirect_router_option_defaults = { NULL, /* qualify_domain */ NULL, /* owners */ NULL, /* owngroups */ -#ifdef EXPERIMENTAL_SRS_ALT - NULL, /* srs */ - NULL, /* srs_alias */ - NULL, /* srs_condition */ - NULL, /* srs_dbinsert */ - NULL, /* srs_dbselect */ -#endif 022, /* modemask */ RDO_REWRITE | RDO_PREPEND_HOME, /* bit_options */ FALSE, /* check_ancestor */ @@ -319,9 +308,8 @@ redirect_router_options_block *ob = while (generated) { - address_item *parent; - address_item *next = generated; - uschar *errors_address = next->prop.errors_address; + address_item * next = generated, * parent; + const uschar * errors_address = next->prop.errors_address; generated = next->next; next->parent = addr; @@ -384,12 +372,11 @@ while (generated) in \N...\N to avoid expansion later. In Cygwin, home directories can contain $ characters. */ - if (rblock->home_directory != NULL) + if (rblock->home_directory) next->home_dir = rblock->home_directory; else if (rblock->check_local_user) next->home_dir = string_sprintf("\\N%s\\N", pw->pw_dir); - else if (rblock->router_home_directory != NULL && - testflag(addr, af_home_expanded)) + else if (rblock->router_home_directory && testflag(addr, af_home_expanded)) { next->home_dir = deliver_home; setflag(next, af_home_expanded); @@ -409,14 +396,16 @@ while (generated) if (next->address[0] == '|') { address_pipe = next->address; - if (rf_get_transport(ob->pipe_transport_name, &(ob->pipe_transport), + GET_OPTION("pipe_transport"); + if (rf_get_transport(ob->pipe_transport_name, &ob->pipe_transport, next, rblock->name, US"pipe_transport")) next->transport = ob->pipe_transport; address_pipe = NULL; } else if (next->address[0] == '>') { - if (rf_get_transport(ob->reply_transport_name, &(ob->reply_transport), + GET_OPTION("reply_transport"); + if (rf_get_transport(ob->reply_transport_name, &ob->reply_transport, next, rblock->name, US"reply_transport")) next->transport = ob->reply_transport; } @@ -426,17 +415,20 @@ while (generated) address_file = next->address; if (next->address[len-1] == '/') { + GET_OPTION("directory_transport"); if (rf_get_transport(ob->directory_transport_name, &(ob->directory_transport), next, rblock->name, US"directory_transport")) next->transport = ob->directory_transport; } else - { - if (rf_get_transport(ob->file_transport_name, &(ob->file_transport), + { + GET_OPTION("file_transport"); + if (rf_get_transport(ob->file_transport_name, &ob->file_transport, next, rblock->name, US"file_transport")) next->transport = ob->file_transport; - } + } + address_file = NULL; } } @@ -540,9 +532,6 @@ addr_prop.remove_headers = NULL; addr_prop.variables = NULL; tree_dup((tree_node **)&addr_prop.variables, addr->prop.variables); -#ifdef EXPERIMENTAL_SRS_ALT -addr_prop.srs_sender = NULL; -#endif #ifdef SUPPORT_I18N addr_prop.utf8_msg = addr->prop.utf8_msg; addr_prop.utf8_downcvt = addr->prop.utf8_downcvt; @@ -575,95 +564,6 @@ if (!ugid.gid_set && pw != NULL) ugid.gid_set = TRUE; } -#ifdef EXPERIMENTAL_SRS_ALT - /* Perform SRS on recipient/return-path as required */ - - if(ob->srs != NULL) - { - BOOL usesrs = TRUE; - - if(ob->srs_condition != NULL) - usesrs = expand_check_condition(ob->srs_condition, "srs_condition expansion failed", NULL); - - if(usesrs) - { - int srs_action = 0, n_srs; - uschar *res; - uschar *usedomain; - - /* What are we doing? */ - if(Ustrcmp(ob->srs, "forward") == 0) - srs_action = 1; - else if(Ustrcmp(ob->srs, "reverseandforward") == 0) - { - srs_action = 3; - - if((ob->srs_dbinsert == NULL) ^ (ob->srs_dbselect == NULL)) - return DEFER; - } - else if(Ustrcmp(ob->srs, "reverse") == 0) - srs_action = 2; - - /* Reverse SRS */ - if(srs_action & 2) - { - srs_orig_recipient = addr->address; - - eximsrs_init(); - if(ob->srs_dbselect) - eximsrs_db_set(TRUE, ob->srs_dbselect); -/* Comment this out for now... -// else -// eximsrs_db_set(TRUE, NULL); -*/ - - if((n_srs = eximsrs_reverse(&res, addr->address)) == OK) - { - srs_recipient = res; - DEBUG(D_any) - debug_printf("SRS (reverse): Recipient '%s' rewritten to '%s'\n", srs_orig_recipient, srs_recipient); - } - - eximsrs_done(); - - if(n_srs != OK) - return n_srs; - } - - /* Forward SRS */ - /* No point in actually performing SRS if we are just verifying a recipient */ - if((srs_action & 1) && verify == v_none && - (sender_address ? sender_address[0] != 0 : FALSE)) - { - - srs_orig_sender = sender_address; - eximsrs_init(); - if(ob->srs_dbinsert) - eximsrs_db_set(FALSE, ob->srs_dbinsert); -/* Comment this out for now... -// else -// eximsrs_db_set(FALSE, NULL); -*/ - - if (!(usedomain = ob->srs_alias ? expand_string(ob->srs_alias) : NULL)) - usedomain = string_copy(deliver_domain); - - if((n_srs = eximsrs_forward(&res, sender_address, usedomain)) == OK) - { - addr_prop.srs_sender = res; - DEBUG(D_any) - debug_printf("SRS (forward): Sender '%s' rewritten to '%s'\n", srs_orig_sender, res); - } - - eximsrs_done(); - - if(n_srs != OK) - return n_srs; - } - } - } -#endif - /* Call the function that interprets redirection data, either inline or from a file. This is a separate function so that the system filter can use it. It will run the function in a subprocess if necessary. If qualify_preserve_domain is @@ -673,11 +573,15 @@ address. Otherwise, if a local qualify_domain is provided, set that up. */ if (ob->qualify_preserve_domain) qualify_domain_recipient = addr->domain; -else if (ob->qualify_domain) +else { - uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc); - if (!new_qdr) return xrc; - qualify_domain_recipient = new_qdr; + GET_OPTION("qualify_domain"); + if (ob->qualify_domain) + { + uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc); + if (!new_qdr) return xrc; + qualify_domain_recipient = new_qdr; + } } redirect.owners = ob->owners; @@ -693,7 +597,7 @@ redirect.string = (redirect.isfile = (ob->file != NULL)) frc = rda_interpret(&redirect, options, ob->include_directory, ob->sieve_vacation_directory, ob->sieve_enotify_mailto_owner, ob->sieve_useraddress, ob->sieve_subaddress, &ugid, &generated, - &(addr->message), ob->skip_syntax_errors? &eblock : NULL, &filtertype, + &addr->message, ob->skip_syntax_errors? &eblock : NULL, &filtertype, string_sprintf("%s router (recipient is %s)", rblock->name, addr->address)); qualify_domain_recipient = save_qualify_domain_recipient; @@ -734,15 +638,13 @@ switch (frc) addr->message = yield == FAIL ? US"forced rejection" : US"forced defer"; else { - int ovector[3]; - if (ob->forbid_smtp_code && - pcre_exec(regex_smtp_code, NULL, CS addr->message, - Ustrlen(addr->message), 0, PCRE_EOPT, - ovector, sizeof(ovector)/sizeof(int)) >= 0) + uschar * matched; + if ( ob->forbid_smtp_code + && regex_match(regex_smtp_code, addr->message, -1, &matched)) { DEBUG(D_route) debug_printf("SMTP code at start of error message " "is ignored because forbid_smtp_code is set\n"); - addr->message += ovector[1]; + addr->message += Ustrlen(matched); } addr->user_message = addr->message; setflag(addr, af_pass_message); @@ -784,7 +686,7 @@ switch (frc) if (filtertype != FILTER_FORWARD && ob->skip_syntax_errors) { - eblock = store_get(sizeof(error_block), FALSE); + eblock = store_get(sizeof(error_block), GET_UNTAINTED); eblock->next = NULL; eblock->text1 = addr->message; eblock->text2 = NULL; @@ -907,4 +809,5 @@ return yield; } #endif /*!MACRO_PREDEF*/ +#endif /*ROUTER_REDIRECT*/ /* End of routers/redirect.c */