Skip to content

Commit

Permalink
Events: raise msg:fail:internal & msg:complete for -Mrm. Bug 2310
Browse files Browse the repository at this point in the history
  • Loading branch information
mkurz authored and Jeremy Harris committed Sep 16, 2018
1 parent b291f36 commit 7ea1237
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 11 deletions.
4 changes: 4 additions & 0 deletions doc/doc-txt/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ JH/23 Bug 2318: Fix the noerror command within filters. It wasn't working.
The ignore_error flag wasn't being returned from the filter subprocess so
was not set for later routers. Investigation and fix by Matthias Kurz.

JH/24 Bug 2310: Raise a msg:fail:internal event for each undelivered recipient,
and a msg:complete for the whole, when a message is manually reoved using
-Mrm. Developement by Matthias Kurz, hacked on by JH.


Exim version 4.91
-----------------
Expand Down
24 changes: 15 additions & 9 deletions src/src/deliver.c
Original file line number Diff line number Diff line change
Expand Up @@ -851,7 +851,7 @@ if (action)
if (!(s = expand_string(action)) && *expand_string_message)
log_write(0, LOG_MAIN|LOG_PANIC,
"failed to expand event_action %s in %s: %s\n",
event, transport_name, expand_string_message);
event, transport_name ? transport_name : US"main", expand_string_message);

event_name = event_data = NULL;

Expand Down Expand Up @@ -6240,17 +6240,23 @@ if (process_recipients != RECIP_IGNORE)
{
uschar * save_local = deliver_localpart;
const uschar * save_domain = deliver_domain;
uschar * addr = new->address, * errmsg = NULL;
int start, end, dom;

deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
if (!parse_extract_address(addr, &errmsg, &start, &end, &dom, TRUE))
log_write(0, LOG_MAIN|LOG_PANIC,
"failed to parse address '%.100s': %s\n", addr, errmsg);
else
{
deliver_localpart =
string_copyn(addr+start, dom ? (dom-1) - start : end - start);
deliver_domain = dom ? CUS string_copyn(addr+dom, end - dom) : CUS"";

(void) event_raise(event_action,
US"msg:fail:internal", new->message);
event_raise(event_action, US"msg:fail:internal", new->message);

deliver_localpart = save_local;
deliver_domain = save_domain;
deliver_localpart = save_local;
deliver_domain = save_domain;
}
}
#endif
}
Expand Down
6 changes: 6 additions & 0 deletions src/src/exim.c
Original file line number Diff line number Diff line change
Expand Up @@ -4449,6 +4449,12 @@ if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD)
int yield = EXIT_SUCCESS;
set_process_info("acting on specified messages");

/* ACL definitions may be needed when removing a message (-Mrm) because
event_action gets expanded */

if (msg_action == MSG_REMOVE)
readconf_rest();

if (!one_msg_action)
{
for (i = msg_action_arg; i < argc; i++)
Expand Down
35 changes: 33 additions & 2 deletions src/src/queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,38 @@ switch(action)
else printf("has been removed or did not exist\n");
if (removed)
{
#ifndef DISABLE_EVENT
for (i = 0; i < recipients_count; i++)
{
tree_node *delivered =
tree_search(tree_nonrecipients, recipients_list[i].address);
if (!delivered)
{
uschar * save_local = deliver_localpart;
const uschar * save_domain = deliver_domain;
uschar * addr = recipients_list[i].address, * errmsg = NULL;
int start, end, dom;

if (!parse_extract_address(addr, &errmsg, &start, &end, &dom, TRUE))
log_write(0, LOG_MAIN|LOG_PANIC,
"failed to parse address '%.100s'\n: %s", addr, errmsg);
else
{
deliver_localpart =
string_copyn(addr+start, dom ? (dom-1) - start : end - start);
deliver_domain = dom
? CUS string_copyn(addr+dom, end - dom) : CUS"";

event_raise(event_action, US"msg:fail:internal",
string_sprintf("message removed by %s", username));

deliver_localpart = save_local;
deliver_domain = save_domain;
}
}
}
(void) event_raise(event_action, US"msg:complete", NULL);
#endif
log_write(0, LOG_MAIN, "removed by %s", username);
log_write(0, LOG_MAIN, "Completed");
}
Expand All @@ -1264,9 +1296,8 @@ switch(action)

case MSG_MARK_ALL_DELIVERED:
for (i = 0; i < recipients_count; i++)
{
tree_add_nonrecipient(recipients_list[i].address);
}

if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
{
printf("has been modified\n");
Expand Down
17 changes: 17 additions & 0 deletions test/log/5700
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,20 @@
1999-03-02 09:44:33 10HmbC-0005vi-00 Completed
1999-03-02 09:44:33 10HmbC-0005vi-00 event msg:complete
1999-03-02 09:44:33 10HmbC-0005vi-00 . finished: 10HmbC-0005vi-00
1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmbE-0005vi-00 event msg:fail:internal
1999-03-02 09:44:33 10HmbE-0005vi-00 . local_part <userx> domain <domain1> reason <message removed by CALLER>
1999-03-02 09:44:33 10HmbE-0005vi-00 event msg:complete
1999-03-02 09:44:33 10HmbE-0005vi-00 . finished: 10HmbE-0005vi-00
1999-03-02 09:44:33 10HmbE-0005vi-00 removed by CALLER
1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmbF-0005vi-00 address <usery@domain1> marked delivered by CALLER
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:fail:internal
1999-03-02 09:44:33 10HmbF-0005vi-00 . local_part <userx> domain <domain1> reason <message removed by CALLER>
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:fail:internal
1999-03-02 09:44:33 10HmbF-0005vi-00 . local_part <userz> domain <domain1> reason <message removed by CALLER>
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:complete
1999-03-02 09:44:33 10HmbF-0005vi-00 . finished: 10HmbF-0005vi-00
1999-03-02 09:44:33 10HmbF-0005vi-00 removed by CALLER
1999-03-02 09:44:33 10HmbF-0005vi-00 Completed
20 changes: 20 additions & 0 deletions test/scripts/5700-events/5700
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,23 @@ A message we will cancel from the queue
****
exim -odi -Mg $msg1
****
#
#
#
#
exim -odq userx@domain1
A message we will remove from the queue
****
exim -Mrm $msg1
****
#
#
#
#
exim -odq userx@domain1 usery@domain1 userz@domain1
A message we will remove from the queue that has delivered recipients already.
****
exim -Mmd $msg1 usery@domain1
****
exim -Mrm $msg1
****
3 changes: 3 additions & 0 deletions test/stdout/5700
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
Message 10HmbE-0005vi-00 has been removed
Message 10HmbF-0005vi-00 has been modified
Message 10HmbF-0005vi-00 has been removed

******** SERVER ********
Listening on port 1224 ...
Expand Down

0 comments on commit 7ea1237

Please sign in to comment.