X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/817d9f576cdfbc27cf0536be348645baf27d7836..f68fe5f62128effcce35efca90d74bc6df066765:/src/src/deliver.c diff --git a/src/src/deliver.c b/src/src/deliver.c index 55a27b023..af39448c5 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -774,6 +774,17 @@ else string_printing(addr->peerdn), US"\""); #endif + if (smtp_authenticated) + { + s = string_append(s, &size, &ptr, 2, US" A=", client_authenticator); + if (client_authenticated_id) + { + s = string_append(s, &size, &ptr, 2, US":", client_authenticated_id); + if (log_extra_selector & LX_smtp_mailauth && client_authenticated_sender) + s = string_append(s, &size, &ptr, 2, US":", client_authenticated_sender); + } + } + if ((log_extra_selector & LX_smtp_confirmation) != 0 && addr->message != NULL) { @@ -2913,6 +2924,23 @@ while (!done) break; #endif + case 'C': /* client authenticator information */ + switch (*ptr++) + { + case '1': + smtp_authenticated = TRUE; + client_authenticator = (*ptr)? string_copy(ptr) : NULL; + break; + case '2': + client_authenticated_id = (*ptr)? string_copy(ptr) : NULL; + break; + case '3': + client_authenticated_sender = (*ptr)? string_copy(ptr) : NULL; + break; + } + while (*ptr++); + break; + case 'A': if (addr == NULL) { @@ -3950,10 +3978,10 @@ for (delivery_count = 0; addr_remote != NULL; delivery_count++) memcpy(big_buffer+1, &transport_count, sizeof(transport_count)); (void)write(fd, big_buffer, sizeof(transport_count) + 1); - /* Information about what happened to each address. Three item types are - used: an optional 'X' item first, for TLS information, followed by 'R' - items for any retry settings, and finally an 'A' item for the remaining - data. */ + /* Information about what happened to each address. Four item types are + used: an optional 'X' item first, for TLS information, then an optional "C" + item for any client-auth info followed by 'R' items for any retry settings, + and finally an 'A' item for the remaining data. */ for(; addr != NULL; addr = addr->next) { @@ -3970,8 +3998,7 @@ for (delivery_count = 0; addr_remote != NULL; delivery_count++) if (addr->cipher != NULL) { ptr = big_buffer; - *ptr++ = 'X'; - sprintf(CS ptr, "%.128s", addr->cipher); + sprintf(CS ptr, "X%.128s", addr->cipher); while(*ptr++); if (addr->peerdn == NULL) *ptr++ = 0; else { @@ -3982,6 +4009,28 @@ for (delivery_count = 0; addr_remote != NULL; delivery_count++) } #endif + if (client_authenticator) + { + ptr = big_buffer; + sprintf(CS big_buffer, "C1%.64s", client_authenticator); + while(*ptr++); + (void)write(fd, big_buffer, ptr - big_buffer); + } + if (client_authenticated_id) + { + ptr = big_buffer; + sprintf(CS big_buffer, "C2%.64s", client_authenticated_id); + while(*ptr++); + (void)write(fd, big_buffer, ptr - big_buffer); + } + if (client_authenticated_sender) + { + ptr = big_buffer; + sprintf(CS big_buffer, "C3%.64s", client_authenticated_sender); + while(*ptr++); + (void)write(fd, big_buffer, ptr - big_buffer); + } + /* Retry information: for most success cases this will be null. */ for (r = addr->retries; r != NULL; r = r->next) @@ -4515,6 +4564,7 @@ FILE *jread; int process_recipients = RECIP_ACCEPT; open_db dbblock; open_db *dbm_file; +extern int acl_where; uschar *info = (queue_run_pid == (pid_t)0)? string_sprintf("delivering %s", id) : @@ -4565,6 +4615,9 @@ message_size = 0; update_spool = FALSE; remove_journal = TRUE; +/* Set a known context for any ACLs we call via expansions */ +acl_where = ACL_WHERE_DELIVERY; + /* Reset the random number generator, so that if several delivery processes are started from a queue runner that has already used random numbers (for sorting), they don't all get the same sequence. */ @@ -7034,6 +7087,7 @@ expand_check_condition) to do a lookup. We must therefore be sure everything is released. */ search_tidyup(); +acl_where = ACL_WHERE_UNKNOWN; return final_yield; }