From 0ef732d996b5f37b28410c5efe132fbbe5c686ef Mon Sep 17 00:00:00 2001 From: Philip Hazel Date: Mon, 23 Oct 2006 13:24:21 +0000 Subject: [PATCH] John Jetmore's -Mset patch. --- doc/doc-txt/ChangeLog | 4 +- doc/doc-txt/NewStuff | 10 ++++- src/ACKNOWLEDGMENTS | 5 ++- src/src/exim.c | 81 ++++++++++++++++++++++++++---------- src/src/macros.h | 4 +- test/confs/0542 | 17 ++++++++ test/log/0542 | 1 + test/scripts/0000-Basic/0542 | 17 ++++++++ test/stdout/0542 | 7 ++++ 9 files changed, 118 insertions(+), 28 deletions(-) create mode 100644 test/confs/0542 create mode 100644 test/log/0542 create mode 100644 test/scripts/0000-Basic/0542 create mode 100644 test/stdout/0542 diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 06a18dc3f..c8e74b5f7 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.412 2006/10/23 10:55:10 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.413 2006/10/23 13:24:21 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- @@ -162,6 +162,8 @@ PH/24 Exim crashed if verify=helo was activated during an incoming -bs connection, where there is no client IP address to check. In this situation, the verify now always succeeds. +PH/25 Applied John Jetmore's -Mset patch. + Exim version 4.63 ----------------- diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff index 267fc9adc..e96087601 100644 --- a/doc/doc-txt/NewStuff +++ b/doc/doc-txt/NewStuff @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/NewStuff,v 1.117 2006/10/16 15:44:36 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/NewStuff,v 1.118 2006/10/23 13:24:21 ph10 Exp $ New Features in Exim -------------------- @@ -131,6 +131,14 @@ Version 4.64 plaintext. This can serve as a means of adding authorization to an authenticator. +7. There is a new command-line option called -Mset. It is useful only in + conjunction with -be (that is, when testing string expansions). It must be + followed by a message id; Exim loads the given message before doing the + expansions, thus setting message-specific variables such as $message_size + and the header variables. This feature is provided to make it easier to test + expansions that make use of these variables. However, Exim must be called by + an admin user when -Mset is used. + Version 4.63 ------------ diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS index 771e6ec08..f20179ede 100644 --- a/src/ACKNOWLEDGMENTS +++ b/src/ACKNOWLEDGMENTS @@ -1,4 +1,4 @@ -$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.59 2006/10/18 08:55:37 ph10 Exp $ +$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.60 2006/10/23 13:24:21 ph10 Exp $ EXIM ACKNOWLEDGEMENTS @@ -20,7 +20,7 @@ relatively small patches. Philip Hazel Lists created: 20 November 2002 -Last updated: 18 October 2006 +Last updated: 23 October 2006 THE OLD LIST @@ -169,6 +169,7 @@ Pierre Humblet Continued Cygwin support Peter Ilieve Suggested patch for lookup search bug John Jetmore Writing and maintaining the 'exipick' utility Much helpful testing of the test suite + Patch for -Mset Bob Johannessen Patch for Sieve envelope tests bug Patch for negative uid/gid bug Christian Kellner Patch for LDAP dereferencing diff --git a/src/src/exim.c b/src/src/exim.c index fc3e67d2b..0a1f2b8c1 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/exim.c,v 1.44 2006/10/02 13:38:18 ph10 Exp $ */ +/* $Cambridge: exim/src/src/exim.c,v 1.45 2006/10/23 13:24:21 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -2252,6 +2252,7 @@ for (i = 1; i < argc; i++) -Mmad mark all recipients delivered -Mmd mark recipients(s) delivered -Mes edit sender + -Mset load a message for use with -be -Mvb show body -Mvh show header -Mvl show log @@ -2289,6 +2290,11 @@ for (i = 1; i < argc; i++) one_msg_action = TRUE; } else if (Ustrcmp(argrest, "rm") == 0) msg_action = MSG_REMOVE; + else if (Ustrcmp(argrest, "set") == 0) + { + msg_action = MSG_LOAD; + one_msg_action = TRUE; + } else if (Ustrcmp(argrest, "t") == 0) msg_action = MSG_THAW; else if (Ustrcmp(argrest, "vb") == 0) { @@ -2886,13 +2892,14 @@ if (( ) || ( msg_action_arg > 0 && - (daemon_listen || queue_interval >= 0 || list_options || checking || - bi_option || test_retry_arg >= 0 || test_rewrite_arg >= 0) + (daemon_listen || queue_interval >= 0 || list_options || + (checking && msg_action != MSG_LOAD) || + bi_option || test_retry_arg >= 0 || test_rewrite_arg >= 0) ) || ( (daemon_listen || queue_interval >= 0) && (sender_address != NULL || list_options || list_queue || checking || - bi_option) + bi_option) ) || ( daemon_listen && queue_interval == 0 @@ -3655,12 +3662,12 @@ if (count_queue) exit(EXIT_SUCCESS); } -/* Handle actions on specific messages, except for the force delivery action, -which is done below. Some actions take a whole list of message ids, which -are known to continue up to the end of the arguments. Others take a single -message id and then operate on the recipients list. */ +/* Handle actions on specific messages, except for the force delivery and +message load actions, which are done below. Some actions take a whole list of +message ids, which are known to continue up to the end of the arguments. Others +take a single message id and then operate on the recipients list. */ -if (msg_action_arg > 0 && msg_action != MSG_DELIVER) +if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD) { int yield = EXIT_SUCCESS; set_process_info("acting on specified messages"); @@ -3840,16 +3847,19 @@ if (list_options) /* Handle a request to deliver one or more messages that are already on the -queue. Values of msg_action other than MSG_DELIVER are dealt with above. This -is typically used for a small number when prodding by hand (when the option -forced_delivery will be set) or when re-execing to regain root privilege. -Each message delivery must happen in a separate process, so we fork a process -for each one, and run them sequentially so that debugging output doesn't get -intertwined, and to avoid spawning too many processes if a long list is given. -However, don't fork for the last one; this saves a process in the common case -when Exim is called to deliver just one message. */ - -if (msg_action_arg > 0) +queue. Values of msg_action other than MSG_DELIVER and MSG_LOAD are dealt with +above. MSG_LOAD is handled with -be (which is the only time it applies) below. + +Delivery of specific messages is typically used for a small number when +prodding by hand (when the option forced_delivery will be set) or when +re-execing to regain root privilege. Each message delivery must happen in a +separate process, so we fork a process for each one, and run them sequentially +so that debugging output doesn't get intertwined, and to avoid spawning too +many processes if a long list is given. However, don't fork for the last one; +this saves a process in the common case when Exim is called to deliver just one +message. */ + +if (msg_action_arg > 0 && msg_action != MSG_LOAD) { if (prod_requires_admin && !admin_user) { @@ -4169,18 +4179,37 @@ if (verify_address_mode || address_test_mode) exim_exit(exit_value); } -/* Handle expansion checking */ +/* Handle expansion checking. Either expand items on the command line, or read +from stdin if there aren't any. If -Mset was specified, load the message so +that its variables can be used, but restrict this facility to admin users. */ if (expansion_test) { + if (msg_action_arg > 0 && msg_action == MSG_LOAD) + { + uschar spoolname[256]; /* Not big_buffer; used in spool_read_header() */ + if (!admin_user) + { + fprintf(stderr, "exim: permission denied\n"); + exit(EXIT_FAILURE); + } + message_id = argv[msg_action_arg]; + (void)string_format(spoolname, sizeof(spoolname), "%s-H", message_id); + if (!spool_open_datafile(message_id)) + printf ("Failed to load message datafile %s\n", message_id); + if (spool_read_header(spoolname, TRUE, FALSE) != spool_read_OK) + printf ("Failed to load message %s\n", message_id); + } + + /* Expand command line items */ + if (recipients_arg < argc) { while (recipients_arg < argc) { uschar *s = argv[recipients_arg++]; uschar *ss = expand_string(s); - if (ss == NULL) - printf ("Failed: %s\n", expand_string_message); + if (ss == NULL) printf ("Failed: %s\n", expand_string_message); else printf("%s\n", CS ss); } } @@ -4212,6 +4241,14 @@ if (expansion_test) #endif } + /* The data file will be open after -Mset */ + + if (deliver_datafile >= 0) + { + (void)close(deliver_datafile); + deliver_datafile = -1; + } + exim_exit(EXIT_SUCCESS); } diff --git a/src/src/macros.h b/src/src/macros.h index 0b0215bdc..6964fbe46 100644 --- a/src/src/macros.h +++ b/src/src/macros.h @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/macros.h,v 1.27 2006/09/05 13:24:10 ph10 Exp $ */ +/* $Cambridge: exim/src/src/macros.h,v 1.28 2006/10/23 13:24:21 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -713,7 +713,7 @@ enum { enum { MSG_DELIVER, MSG_FREEZE, MSG_REMOVE, MSG_THAW, MSG_ADD_RECIPIENT, MSG_MARK_ALL_DELIVERED, MSG_MARK_DELIVERED, MSG_EDIT_SENDER, - MSG_SHOW_BODY, MSG_SHOW_HEADER, MSG_SHOW_LOG }; + MSG_SHOW_BODY, MSG_SHOW_HEADER, MSG_SHOW_LOG, MSG_LOAD }; /* Returns from the spool_read_header() function */ diff --git a/test/confs/0542 b/test/confs/0542 new file mode 100644 index 000000000..7b886eaa1 --- /dev/null +++ b/test/confs/0542 @@ -0,0 +1,17 @@ +# Exim test configuration 0542 + +exim_path = EXIM_PATH +host_lookup_order = bydns +primary_hostname = myhost.test.ex +rfc1413_query_timeout = 0s +spool_directory = DIR/spool +log_file_path = DIR/spool/log/%slog +gecos_pattern = "" +gecos_name = CALLER_NAME + +# ----- Main settings ----- + +queue_only + + +# End diff --git a/test/log/0542 b/test/log/0542 new file mode 100644 index 000000000..f59faf8b9 --- /dev/null +++ b/test/log/0542 @@ -0,0 +1 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss diff --git a/test/scripts/0000-Basic/0542 b/test/scripts/0000-Basic/0542 new file mode 100644 index 000000000..90645d746 --- /dev/null +++ b/test/scripts/0000-Basic/0542 @@ -0,0 +1,17 @@ +# -Mset +exim userx@test.x usery@test.ex +From: Himself +To: Yourself +Subject: The subject is not the object + +This is the body of the message. +**** +sudo exim -be -Mset $msg1 +From: $h_from: +Subject: $h_subject: +message_body_size=$message_body_size +message_size=$message_size +message_id=$message_id +message_exim_id=$message_exim_id +**** +no_msglog_check diff --git a/test/stdout/0542 b/test/stdout/0542 new file mode 100644 index 000000000..aecedca72 --- /dev/null +++ b/test/stdout/0542 @@ -0,0 +1,7 @@ +> From: Himself +> Subject: The subject is not the object +> message_body_size=33 +> message_size=416 +> message_id=10HmaX-0005vi-00 +> message_exim_id=10HmaX-0005vi-00 +> -- 2.25.1