From: Jeremy Harris Date: Thu, 20 Jan 2022 10:50:34 +0000 (+0000) Subject: Debug: more detail for expansions X-Git-Tag: exim-4.96-RC0~97 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/1058096b8c5317376c1df7473f6ca7c543d20715 Debug: more detail for expansions --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 20c6948ad..33285f9b9 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -73,6 +73,9 @@ JH/16 Debugging initiated by an ACL control now continues through into routing and transport processes, when delivery is immediate. Previously debugging stopped any time Exim re-execs. +JH/17 The "expand" debug selector now gives more detail, specifically on the + result of expansion operators (as opposed to expansion items). + Exim version 4.95 ----------------- diff --git a/src/src/expand.c b/src/src/expand.c index f1f0a4a38..810fc1cde 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -4468,23 +4468,12 @@ expand_string_internal(const uschar *string, BOOL ket_ends, const uschar **left, rmark reset_point = store_mark(); gstring * yield = string_get(Ustrlen(string) + 64); int item_type; -const uschar *s = string; -const uschar *save_expand_nstring[EXPAND_MAXN+1]; +const uschar * s = string; +const uschar * save_expand_nstring[EXPAND_MAXN+1]; int save_expand_nlength[EXPAND_MAXN+1]; -BOOL resetok = TRUE; +BOOL resetok = TRUE, first = TRUE; expand_level++; -DEBUG(D_expand) - DEBUG(D_noutf8) - debug_printf_indent("/%s: %s\n", - skipping ? "---scanning" : "considering", string); - else - debug_printf_indent(UTF8_DOWN_RIGHT "%s: %s\n", - skipping - ? UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ "scanning" - : "considering", - string); - f.expand_string_forcedfail = FALSE; expand_string_message = US""; @@ -4500,6 +4489,22 @@ while (*s) { uschar name[256]; + DEBUG(D_expand) + { + DEBUG(D_noutf8) + debug_printf_indent("%c%s: %s\n", + first ? '/' : '|', + skipping ? "---scanning" : "considering", s); + else + debug_printf_indent("%s%s: %s\n", + first ? UTF8_DOWN_RIGHT : UTF8_VERT_RIGHT, + skipping + ? UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ "scanning" + : "considering", + s); + first = FALSE; + } + /* \ escapes the next character, which must exist, or else the expansion fails. There's a special escape, \N, which causes copying of the subject verbatim up to the next \N. Otherwise, @@ -4516,7 +4521,13 @@ while (*s) if (s[1] == 'N') { const uschar * t = s + 2; - for (s = t; *s != 0; s++) if (*s == '\\' && s[1] == 'N') break; + for (s = t; *s ; s++) if (*s == '\\' && s[1] == 'N') break; + DEBUG(D_expand) + DEBUG(D_noutf8) + debug_printf_indent("|--protected: %.*s\n", (int)(s - t), t); + else + debug_printf_indent(UTF8_VERT_RIGHT UTF8_HORIZ UTF8_HORIZ + "protected: %.*s\n", (int)(s - t), t); yield = string_catn(yield, t, s - t); if (*s != 0) s += 2; } @@ -4524,6 +4535,11 @@ while (*s) else { uschar ch[1]; + DEBUG(D_expand) + DEBUG(D_noutf8) + debug_printf_indent("|backslashed: '\\%c'\n", s[1]); + else + debug_printf_indent(UTF8_VERT_RIGHT "backslashed: '\\%c'\n", s[1]); ch[0] = string_interpret_escape(&s); s++; yield = string_catn(yield, ch, 1); @@ -4541,7 +4557,20 @@ while (*s) if (*s != '$' || !honour_dollar) { - yield = string_catn(yield, s++, 1); + int i = 1; /*{*/ + for(const uschar * t = s+1; *t && *t != '$' && *t != '}' && *t != '\\'; t++) + i++; + + DEBUG(D_expand) + DEBUG(D_noutf8) + debug_printf_indent("|-------text: %.*s\n", i, s); + else + debug_printf_indent(UTF8_VERT_RIGHT + UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ + "text: %.*s\n", i, s); + + yield = string_catn(yield, s, i); + s += i; continue; } @@ -4654,7 +4683,7 @@ while (*s) } /* After { there can be various things, but they all start with - an initial word, except for a number for a string match variable. */ + an initial word, except for a number for a string match variable. */ /*}*/ if (isdigit((*(++s)))) { @@ -4678,7 +4707,7 @@ while (*s) /* Allow "-" in names to cater for substrings with negative arguments. Since we are checking for known names after { this is - OK. */ + OK. */ /*}*/ s = read_name(name, sizeof(name), s, US"_-"); item_type = chop_match(name, item_table, nelem(item_table)); @@ -4827,7 +4856,7 @@ while (*s) #ifdef SUPPORT_I18N case EITEM_IMAPFOLDER: - { /* ${imapfolder {name}{sep]{specials}} */ + { /* ${imapfolder {name}{sep}{specials}} */ uschar *sub_arg[3]; uschar *encoded; @@ -4964,10 +4993,11 @@ while (*s) if (*s != '{') { expand_string_message = US"missing '{' for lookup file-or-query arg"; - goto EXPAND_FAILED_CURLY; + goto EXPAND_FAILED_CURLY; /*}}*/ } if (!(filename = expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok))) goto EXPAND_FAILED; + /*{{*/ if (*s++ != '}') { expand_string_message = US"missing '}' closing lookup file-or-query arg"; @@ -5000,7 +5030,7 @@ while (*s) lookup_value = NULL; else { - void *handle = search_open(filename, stype, 0, NULL, NULL); + void * handle = search_open(filename, stype, 0, NULL, NULL); if (!handle) { expand_string_message = search_error_message; @@ -5047,15 +5077,15 @@ while (*s) or ${perl{sub}{arg1}{arg2}} or up to a maximum of EXIM_PERL_MAX_ARGS arguments (defined below). */ - #define EXIM_PERL_MAX_ARGS 8 + #define EXIM_PERL_MAX_ARGS 8 case EITEM_PERL: - #ifndef EXIM_PERL + #ifndef EXIM_PERL expand_string_message = US"\"${perl\" encountered, but this facility " /*}*/ "is not included in this binary"; goto EXPAND_FAILED; - #else /* EXIM_PERL */ + #else /* EXIM_PERL */ { uschar *sub_arg[EXIM_PERL_MAX_ARGS + 2]; gstring *new_yield; @@ -5128,7 +5158,7 @@ while (*s) yield = new_yield; continue; } - #endif /* EXIM_PERL */ + #endif /* EXIM_PERL */ /* Transform email address to "prvs" scheme to use as BATV-signed return path */ @@ -5205,7 +5235,7 @@ while (*s) PH: Actually, that isn't necessary. The read_subs() function is designed to work this way for the ${if and ${lookup expansions. I've tidied the code. - */ + */ /*}}*/ /* Reset expansion variables */ prvscheck_result = NULL; @@ -5469,21 +5499,21 @@ while (*s) /* The whole thing has worked (or we were skipping). If there is a failure string following, we need to skip it. */ - if (*s == '{') + if (*s == '{') /*}*/ { if (!expand_string_internal(s+1, TRUE, &s, TRUE, TRUE, &resetok)) - goto EXPAND_FAILED; + goto EXPAND_FAILED; /*{*/ if (*s++ != '}') - { + { /*{*/ expand_string_message = US"missing '}' closing failstring for readsocket"; goto EXPAND_FAILED_CURLY; } Uskip_whitespace(&s); } - READSOCK_DONE: + READSOCK_DONE: /*{*/ if (*s++ != '}') - { + { /*{*/ expand_string_message = US"missing '}' closing readsocket"; goto EXPAND_FAILED_CURLY; } @@ -5494,13 +5524,13 @@ while (*s) use it. Otherwise, those conditions give expand errors. */ SOCK_FAIL: - if (*s != '{') goto EXPAND_FAILED; + if (*s != '{') goto EXPAND_FAILED; /*}*/ DEBUG(D_any) debug_printf("%s\n", expand_string_message); if (!(arg = expand_string_internal(s+1, TRUE, &s, FALSE, TRUE, &resetok))) goto EXPAND_FAILED; - yield = string_cat(yield, arg); + yield = string_cat(yield, arg); /*{*/ if (*s++ != '}') - { + { /*{*/ expand_string_message = US"missing '}' closing failstring for readsocket"; goto EXPAND_FAILED_CURLY; } @@ -5900,6 +5930,7 @@ while (*s) } /* Match - set up for expanding the replacement. */ + DEBUG(D_expand) debug_printf_indent("%s: match\n", name); if (n == 0) n = EXPAND_MAXN + 1; expand_nmax = 0; @@ -6388,7 +6419,7 @@ while (*s) uschar *save_lookup_value = lookup_value; Uskip_whitespace(&s); - if (*s++ != '{') + if (*s++ != '{') /*}*/ { expand_string_message = string_sprintf("missing '{' for first arg of %s", name); @@ -6397,8 +6428,10 @@ while (*s) if (!(list = expand_string_internal(s, TRUE, &s, skipping, TRUE, &resetok))) goto EXPAND_FAILED; + /*{*/ if (*s++ != '}') { + /*{*/ expand_string_message = string_sprintf("missing '}' closing first arg of %s", name); goto EXPAND_FAILED_CURLY; @@ -6424,10 +6457,10 @@ while (*s) } Uskip_whitespace(&s); - if (*s++ != '{') + if (*s++ != '{') /*}*/ { expand_string_message = - string_sprintf("missing '{' for last arg of %s", name); + string_sprintf("missing '{' for last arg of %s", name); /*}*/ goto EXPAND_FAILED_CURLY; } @@ -6859,7 +6892,7 @@ while (*s) if (!key) goto EXPAND_FAILED; /*{*/ if (*s++ != '}') { - expand_string_message = US"missing '{' for name arg of env"; + expand_string_message = US"missing '{' for name arg of env"; /*}*/ goto EXPAND_FAILED_CURLY; } @@ -7008,7 +7041,7 @@ while (*s) FALSE, &resetok); if (!sub) goto EXPAND_FAILED; /*{*/ if (*s1 != '}') - { + { /*{*/ expand_string_message = string_sprintf("missing '}' closing cert arg of %s", name); goto EXPAND_FAILED_CURLY; @@ -7037,125 +7070,128 @@ while (*s) if (skipping && c >= 0) continue; - /* Otherwise, switch on the operator type */ + /* Otherwise, switch on the operator type. After handling go back + to the main loop top. */ - switch(c) + { + int start = yield->ptr; + switch(c) { case EOP_BASE32: { - uschar *t; - unsigned long int n = Ustrtoul(sub, &t, 10); + uschar *t; + unsigned long int n = Ustrtoul(sub, &t, 10); gstring * g = NULL; - if (*t != 0) - { - expand_string_message = string_sprintf("argument for base32 " - "operator is \"%s\", which is not a decimal number", sub); - goto EXPAND_FAILED; - } + if (*t != 0) + { + expand_string_message = string_sprintf("argument for base32 " + "operator is \"%s\", which is not a decimal number", sub); + goto EXPAND_FAILED; + } for ( ; n; n >>= 5) g = string_catn(g, &base32_chars[n & 0x1f], 1); if (g) while (g->ptr > 0) yield = string_catn(yield, &g->s[--g->ptr], 1); - continue; + break; } case EOP_BASE32D: - { - uschar *tt = sub; - unsigned long int n = 0; - while (*tt) - { - uschar * t = Ustrchr(base32_chars, *tt++); - if (!t) - { - expand_string_message = string_sprintf("argument for base32d " - "operator is \"%s\", which is not a base 32 number", sub); - goto EXPAND_FAILED; - } - n = n * 32 + (t - base32_chars); - } - yield = string_fmt_append(yield, "%ld", n); - continue; - } + { + uschar *tt = sub; + unsigned long int n = 0; + while (*tt) + { + uschar * t = Ustrchr(base32_chars, *tt++); + if (!t) + { + expand_string_message = string_sprintf("argument for base32d " + "operator is \"%s\", which is not a base 32 number", sub); + goto EXPAND_FAILED; + } + n = n * 32 + (t - base32_chars); + } + yield = string_fmt_append(yield, "%ld", n); + break; + } case EOP_BASE62: - { - uschar *t; - unsigned long int n = Ustrtoul(sub, &t, 10); - if (*t != 0) - { - expand_string_message = string_sprintf("argument for base62 " - "operator is \"%s\", which is not a decimal number", sub); - goto EXPAND_FAILED; - } - yield = string_cat(yield, string_base62(n)); - continue; - } + { + uschar *t; + unsigned long int n = Ustrtoul(sub, &t, 10); + if (*t != 0) + { + expand_string_message = string_sprintf("argument for base62 " + "operator is \"%s\", which is not a decimal number", sub); + goto EXPAND_FAILED; + } + yield = string_cat(yield, string_base62(n)); + break; + } /* Note that for Darwin and Cygwin, BASE_62 actually has the value 36 */ case EOP_BASE62D: - { - uschar *tt = sub; - unsigned long int n = 0; - while (*tt != 0) - { - uschar *t = Ustrchr(base62_chars, *tt++); - if (!t) - { - expand_string_message = string_sprintf("argument for base62d " - "operator is \"%s\", which is not a base %d number", sub, - BASE_62); - goto EXPAND_FAILED; - } - n = n * BASE_62 + (t - base62_chars); - } - yield = string_fmt_append(yield, "%ld", n); - continue; - } + { + uschar *tt = sub; + unsigned long int n = 0; + while (*tt != 0) + { + uschar *t = Ustrchr(base62_chars, *tt++); + if (!t) + { + expand_string_message = string_sprintf("argument for base62d " + "operator is \"%s\", which is not a base %d number", sub, + BASE_62); + goto EXPAND_FAILED; + } + n = n * BASE_62 + (t - base62_chars); + } + yield = string_fmt_append(yield, "%ld", n); + break; + } case EOP_EXPAND: - { - uschar *expanded = expand_string_internal(sub, FALSE, NULL, skipping, TRUE, &resetok); - if (!expanded) - { - expand_string_message = - string_sprintf("internal expansion of \"%s\" failed: %s", sub, - expand_string_message); - goto EXPAND_FAILED; - } - yield = string_cat(yield, expanded); - continue; - } + { + uschar *expanded = expand_string_internal(sub, FALSE, NULL, skipping, TRUE, &resetok); + if (!expanded) + { + expand_string_message = + string_sprintf("internal expansion of \"%s\" failed: %s", sub, + expand_string_message); + goto EXPAND_FAILED; + } + yield = string_cat(yield, expanded); + break; + } case EOP_LC: - { - int count = 0; - uschar *t = sub - 1; - while (*(++t) != 0) { *t = tolower(*t); count++; } - yield = string_catn(yield, sub, count); - continue; - } + { + int count = 0; + uschar *t = sub - 1; + while (*(++t) != 0) { *t = tolower(*t); count++; } + yield = string_catn(yield, sub, count); + break; + } case EOP_UC: - { - int count = 0; - uschar *t = sub - 1; - while (*(++t) != 0) { *t = toupper(*t); count++; } - yield = string_catn(yield, sub, count); - continue; - } + { + int count = 0; + uschar *t = sub - 1; + while (*(++t) != 0) { *t = toupper(*t); count++; } + yield = string_catn(yield, sub, count); + break; + } case EOP_MD5: -#ifndef DISABLE_TLS + #ifndef DISABLE_TLS if (vp && *(void **)vp->value) { uschar * cp = tls_cert_fprt_md5(*(void **)vp->value); yield = string_cat(yield, cp); } else -#endif + #endif { md5 base; uschar digest[16]; @@ -7164,17 +7200,17 @@ while (*s) for (int j = 0; j < 16; j++) yield = string_fmt_append(yield, "%02x", digest[j]); } - continue; + break; case EOP_SHA1: -#ifndef DISABLE_TLS + #ifndef DISABLE_TLS if (vp && *(void **)vp->value) { uschar * cp = tls_cert_fprt_sha1(*(void **)vp->value); yield = string_cat(yield, cp); } else -#endif + #endif { hctx h; uschar digest[20]; @@ -7183,11 +7219,11 @@ while (*s) for (int j = 0; j < 20; j++) yield = string_fmt_append(yield, "%02X", digest[j]); } - continue; + break; case EOP_SHA2: case EOP_SHA256: -#ifdef EXIM_HAVE_SHA2 + #ifdef EXIM_HAVE_SHA2 if (vp && *(void **)vp->value) if (c == EOP_SHA256) yield = string_cat(yield, tls_cert_fprt_sha256(*(void **)vp->value)); @@ -7214,13 +7250,13 @@ while (*s) while (b.len-- > 0) yield = string_fmt_append(yield, "%02X", *b.data++); } -#else + #else expand_string_message = US"sha256 only supported with TLS"; -#endif - continue; + #endif + break; case EOP_SHA3: -#ifdef EXIM_HAVE_SHA3 + #ifdef EXIM_HAVE_SHA3 { hctx h; blob b; @@ -7242,84 +7278,84 @@ while (*s) while (b.len-- > 0) yield = string_fmt_append(yield, "%02X", *b.data++); } - continue; -#else + break; + #else expand_string_message = US"sha3 only supported with GnuTLS 3.5.0 + or OpenSSL 1.1.1 +"; goto EXPAND_FAILED; -#endif + #endif /* Convert hex encoding to base64 encoding */ case EOP_HEX2B64: - { - int c = 0; - int b = -1; - uschar *in = sub; - uschar *out = sub; - uschar *enc; + { + int c = 0; + int b = -1; + uschar *in = sub; + uschar *out = sub; + uschar *enc; - for (enc = sub; *enc; enc++) - { - if (!isxdigit(*enc)) - { - expand_string_message = string_sprintf("\"%s\" is not a hex " - "string", sub); - goto EXPAND_FAILED; - } - c++; - } + for (enc = sub; *enc; enc++) + { + if (!isxdigit(*enc)) + { + expand_string_message = string_sprintf("\"%s\" is not a hex " + "string", sub); + goto EXPAND_FAILED; + } + c++; + } - if ((c & 1) != 0) - { - expand_string_message = string_sprintf("\"%s\" contains an odd " - "number of characters", sub); - goto EXPAND_FAILED; - } + if ((c & 1) != 0) + { + expand_string_message = string_sprintf("\"%s\" contains an odd " + "number of characters", sub); + goto EXPAND_FAILED; + } - while ((c = *in++) != 0) - { - if (isdigit(c)) c -= '0'; - else c = toupper(c) - 'A' + 10; - if (b == -1) - b = c << 4; - else - { - *out++ = b | c; - b = -1; - } - } + while ((c = *in++) != 0) + { + if (isdigit(c)) c -= '0'; + else c = toupper(c) - 'A' + 10; + if (b == -1) + b = c << 4; + else + { + *out++ = b | c; + b = -1; + } + } - enc = b64encode(CUS sub, out - sub); - yield = string_cat(yield, enc); - continue; - } + enc = b64encode(CUS sub, out - sub); + yield = string_cat(yield, enc); + break; + } /* Convert octets outside 0x21..0x7E to \xXX form */ case EOP_HEXQUOTE: { - uschar *t = sub - 1; - while (*(++t) != 0) - { - if (*t < 0x21 || 0x7E < *t) - yield = string_fmt_append(yield, "\\x%02x", *t); + uschar *t = sub - 1; + while (*(++t) != 0) + { + if (*t < 0x21 || 0x7E < *t) + yield = string_fmt_append(yield, "\\x%02x", *t); else yield = string_catn(yield, t, 1); - } - continue; + } + break; } /* count the number of list elements */ case EOP_LISTCOUNT: - { + { int cnt = 0, sep = 0; uschar * buf = store_get(2, is_tainted(sub)); while (string_nextinlist(CUSS &sub, &sep, buf, 1)) cnt++; yield = string_fmt_append(yield, "%d", cnt); - continue; - } + break; + } /* expand a named list given the name */ /* handles nested named lists; requotes as colon-sep list */ @@ -7329,7 +7365,7 @@ while (*s) yield = expand_listnamed(yield, sub, arg); if (expand_string_message) goto EXPAND_FAILED; - continue; + break; /* quote a list-item for the given list-separator */ @@ -7337,49 +7373,49 @@ while (*s) ${mask:131.111.10.206/28} is 131.111.10.192/28. */ case EOP_MASK: - { - int count; - uschar *endptr; - int binary[4]; - int type, mask, maskoffset; + { + int count; + uschar *endptr; + int binary[4]; + int type, mask, maskoffset; BOOL normalised; - uschar buffer[64]; + uschar buffer[64]; - if ((type = string_is_ip_address(sub, &maskoffset)) == 0) - { - expand_string_message = string_sprintf("\"%s\" is not an IP address", - sub); - goto EXPAND_FAILED; - } + if ((type = string_is_ip_address(sub, &maskoffset)) == 0) + { + expand_string_message = string_sprintf("\"%s\" is not an IP address", + sub); + goto EXPAND_FAILED; + } - if (maskoffset == 0) - { - expand_string_message = string_sprintf("missing mask value in \"%s\"", - sub); - goto EXPAND_FAILED; - } + if (maskoffset == 0) + { + expand_string_message = string_sprintf("missing mask value in \"%s\"", + sub); + goto EXPAND_FAILED; + } - mask = Ustrtol(sub + maskoffset + 1, &endptr, 10); + mask = Ustrtol(sub + maskoffset + 1, &endptr, 10); - if (*endptr || mask < 0 || mask > (type == 4 ? 32 : 128)) - { - expand_string_message = string_sprintf("mask value too big in \"%s\"", - sub); - goto EXPAND_FAILED; - } + if (*endptr || mask < 0 || mask > (type == 4 ? 32 : 128)) + { + expand_string_message = string_sprintf("mask value too big in \"%s\"", + sub); + goto EXPAND_FAILED; + } /* If an optional 'n' was given, ipv6 gets normalised output: colons rather than dots, and zero-compressed. */ normalised = arg && *arg == 'n'; - /* Convert the address to binary integer(s) and apply the mask */ + /* Convert the address to binary integer(s) and apply the mask */ - sub[maskoffset] = 0; - count = host_aton(sub, binary); - host_mask(count, binary, mask); + sub[maskoffset] = 0; + count = host_aton(sub, binary); + host_mask(count, binary, mask); - /* Convert to masked textual format and add to output. */ + /* Convert to masked textual format and add to output. */ if (type == 4 || !normalised) yield = string_catn(yield, buffer, @@ -7389,13 +7425,13 @@ while (*s) ipv6_nmtoa(binary, buffer); yield = string_fmt_append(yield, "%s/%d", buffer, mask); } - continue; - } + break; + } case EOP_IPV6NORM: case EOP_IPV6DENORM: { - int type = string_is_ip_address(sub, NULL); + int type = string_is_ip_address(sub, NULL); int binary[4]; uschar buffer[44]; @@ -7421,94 +7457,94 @@ while (*s) ? ipv6_nmtoa(binary, buffer) : host_nmtoa(4, binary, -1, buffer, ':') ); - continue; + break; } case EOP_ADDRESS: case EOP_LOCAL_PART: case EOP_DOMAIN: - { - uschar * error; - int start, end, domain; - uschar * t = parse_extract_address(sub, &error, &start, &end, &domain, - FALSE); - if (t) + { + uschar * error; + int start, end, domain; + uschar * t = parse_extract_address(sub, &error, &start, &end, &domain, + FALSE); + if (t) if (c != EOP_DOMAIN) yield = c == EOP_LOCAL_PART && domain > 0 ? string_catn(yield, t, domain - 1) : string_cat(yield, t); else if (domain > 0) yield = string_cat(yield, t + domain); - continue; - } + break; + } case EOP_ADDRESSES: - { - uschar outsep[2] = { ':', '\0' }; - uschar *address, *error; - int save_ptr = gstring_length(yield); - int start, end, domain; /* Not really used */ + { + uschar outsep[2] = { ':', '\0' }; + uschar *address, *error; + int save_ptr = gstring_length(yield); + int start, end, domain; /* Not really used */ if (Uskip_whitespace(&sub) == '>') - if (*outsep = *++sub) ++sub; - else + if (*outsep = *++sub) ++sub; + else { - expand_string_message = string_sprintf("output separator " - "missing in expanding ${addresses:%s}", --sub); - goto EXPAND_FAILED; - } - f.parse_allow_group = TRUE; + expand_string_message = string_sprintf("output separator " + "missing in expanding ${addresses:%s}", --sub); + goto EXPAND_FAILED; + } + f.parse_allow_group = TRUE; - for (;;) - { - uschar * p = parse_find_address_end(sub, FALSE); - uschar saveend = *p; - *p = '\0'; - address = parse_extract_address(sub, &error, &start, &end, &domain, - FALSE); - *p = saveend; - - /* Add the address to the output list that we are building. This is - done in chunks by searching for the separator character. At the - start, unless we are dealing with the first address of the output - list, add in a space if the new address begins with the separator - character, or is an empty string. */ - - if (address) - { - if (yield && yield->ptr != save_ptr && address[0] == *outsep) - yield = string_catn(yield, US" ", 1); + for (;;) + { + uschar * p = parse_find_address_end(sub, FALSE); + uschar saveend = *p; + *p = '\0'; + address = parse_extract_address(sub, &error, &start, &end, &domain, + FALSE); + *p = saveend; + + /* Add the address to the output list that we are building. This is + done in chunks by searching for the separator character. At the + start, unless we are dealing with the first address of the output + list, add in a space if the new address begins with the separator + character, or is an empty string. */ + + if (address) + { + if (yield && yield->ptr != save_ptr && address[0] == *outsep) + yield = string_catn(yield, US" ", 1); - for (;;) - { - size_t seglen = Ustrcspn(address, outsep); - yield = string_catn(yield, address, seglen + 1); + for (;;) + { + size_t seglen = Ustrcspn(address, outsep); + yield = string_catn(yield, address, seglen + 1); - /* If we got to the end of the string we output one character - too many. */ + /* If we got to the end of the string we output one character + too many. */ - if (address[seglen] == '\0') { yield->ptr--; break; } - yield = string_catn(yield, outsep, 1); - address += seglen + 1; - } + if (address[seglen] == '\0') { yield->ptr--; break; } + yield = string_catn(yield, outsep, 1); + address += seglen + 1; + } - /* Output a separator after the string: we will remove the - redundant final one at the end. */ + /* Output a separator after the string: we will remove the + redundant final one at the end. */ - yield = string_catn(yield, outsep, 1); - } + yield = string_catn(yield, outsep, 1); + } - if (saveend == '\0') break; - sub = p + 1; - } + if (saveend == '\0') break; + sub = p + 1; + } - /* If we have generated anything, remove the redundant final - separator. */ + /* If we have generated anything, remove the redundant final + separator. */ - if (yield && yield->ptr != save_ptr) yield->ptr--; - f.parse_allow_group = FALSE; - continue; - } + if (yield && yield->ptr != save_ptr) yield->ptr--; + f.parse_allow_group = FALSE; + break; + } /* quote puts a string in quotes if it is empty or contains anything @@ -7522,584 +7558,618 @@ while (*s) case EOP_QUOTE: case EOP_QUOTE_LOCAL_PART: - if (!arg) - { - BOOL needs_quote = (!*sub); /* TRUE for empty string */ - uschar *t = sub - 1; + if (!arg) + { + BOOL needs_quote = (!*sub); /* TRUE for empty string */ + uschar *t = sub - 1; - if (c == EOP_QUOTE) - while (!needs_quote && *++t) - needs_quote = !isalnum(*t) && !strchr("_-.", *t); + if (c == EOP_QUOTE) + while (!needs_quote && *++t) + needs_quote = !isalnum(*t) && !strchr("_-.", *t); - else /* EOP_QUOTE_LOCAL_PART */ - while (!needs_quote && *++t) - needs_quote = !isalnum(*t) - && strchr("!#$%&'*+-/=?^_`{|}~", *t) == NULL - && (*t != '.' || t == sub || !t[1]); + else /* EOP_QUOTE_LOCAL_PART */ + while (!needs_quote && *++t) + needs_quote = !isalnum(*t) + && strchr("!#$%&'*+-/=?^_`{|}~", *t) == NULL + && (*t != '.' || t == sub || !t[1]); - if (needs_quote) - { - yield = string_catn(yield, US"\"", 1); - t = sub - 1; - while (*++t) - if (*t == '\n') - yield = string_catn(yield, US"\\n", 2); - else if (*t == '\r') - yield = string_catn(yield, US"\\r", 2); - else - { - if (*t == '\\' || *t == '"') - yield = string_catn(yield, US"\\", 1); - yield = string_catn(yield, t, 1); - } - yield = string_catn(yield, US"\"", 1); - } - else - yield = string_cat(yield, sub); - continue; - } + if (needs_quote) + { + yield = string_catn(yield, US"\"", 1); + t = sub - 1; + while (*++t) + if (*t == '\n') + yield = string_catn(yield, US"\\n", 2); + else if (*t == '\r') + yield = string_catn(yield, US"\\r", 2); + else + { + if (*t == '\\' || *t == '"') + yield = string_catn(yield, US"\\", 1); + yield = string_catn(yield, t, 1); + } + yield = string_catn(yield, US"\"", 1); + } + else + yield = string_cat(yield, sub); + break; + } - /* quote_lookuptype does lookup-specific quoting */ + /* quote_lookuptype does lookup-specific quoting */ - else - { - int n; - uschar * opt = Ustrchr(arg, '_'); + else + { + int n; + uschar * opt = Ustrchr(arg, '_'); - if (opt) *opt++ = 0; + if (opt) *opt++ = 0; - if ((n = search_findtype(arg, Ustrlen(arg))) < 0) - { - expand_string_message = search_error_message; - goto EXPAND_FAILED; - } + if ((n = search_findtype(arg, Ustrlen(arg))) < 0) + { + expand_string_message = search_error_message; + goto EXPAND_FAILED; + } if (lookup_list[n]->quote) sub = (lookup_list[n]->quote)(sub, opt); else if (opt) sub = NULL; - if (!sub) - { - expand_string_message = string_sprintf( - "\"%s\" unrecognized after \"${quote_%s\"", - opt, arg); - goto EXPAND_FAILED; - } - - yield = string_cat(yield, sub); - continue; - } - - /* rx quote sticks in \ before any non-alphameric character so that - the insertion works in a regular expression. */ - - case EOP_RXQUOTE: - { - uschar *t = sub - 1; - while (*(++t) != 0) - { - if (!isalnum(*t)) - yield = string_catn(yield, US"\\", 1); - yield = string_catn(yield, t, 1); - } - continue; - } - - /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as - prescribed by the RFC, if there are characters that need to be encoded */ + if (!sub) + { + expand_string_message = string_sprintf( + "\"%s\" unrecognized after \"${quote_%s\"", /*}*/ + opt, arg); + goto EXPAND_FAILED; + } - case EOP_RFC2047: - yield = string_cat(yield, - parse_quote_2047(sub, Ustrlen(sub), headers_charset, - FALSE)); - continue; + yield = string_cat(yield, sub); + break; + } - /* RFC 2047 decode */ + /* rx quote sticks in \ before any non-alphameric character so that + the insertion works in a regular expression. */ - case EOP_RFC2047D: - { - int len; - uschar *error; - uschar *decoded = rfc2047_decode(sub, check_rfc2047_length, - headers_charset, '?', &len, &error); - if (error) - { - expand_string_message = error; - goto EXPAND_FAILED; - } - yield = string_catn(yield, decoded, len); - continue; - } + case EOP_RXQUOTE: + { + uschar *t = sub - 1; + while (*(++t) != 0) + { + if (!isalnum(*t)) + yield = string_catn(yield, US"\\", 1); + yield = string_catn(yield, t, 1); + } + break; + } - /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into - underscores */ + /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as + prescribed by the RFC, if there are characters that need to be encoded */ - case EOP_FROM_UTF8: - { - uschar * buff = store_get(4, is_tainted(sub)); - while (*sub) - { - int c; - GETUTF8INC(c, sub); - if (c > 255) c = '_'; - buff[0] = c; - yield = string_catn(yield, buff, 1); - } - continue; - } + case EOP_RFC2047: + yield = string_cat(yield, + parse_quote_2047(sub, Ustrlen(sub), headers_charset, + FALSE)); + break; - /* replace illegal UTF-8 sequences by replacement character */ + /* RFC 2047 decode */ - #define UTF8_REPLACEMENT_CHAR US"?" + case EOP_RFC2047D: + { + int len; + uschar *error; + uschar *decoded = rfc2047_decode(sub, check_rfc2047_length, + headers_charset, '?', &len, &error); + if (error) + { + expand_string_message = error; + goto EXPAND_FAILED; + } + yield = string_catn(yield, decoded, len); + break; + } - case EOP_UTF8CLEAN: - { - int seq_len = 0, index = 0; - int bytes_left = 0; - long codepoint = -1; - int complete; - uschar seq_buff[4]; /* accumulate utf-8 here */ + /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into + underscores */ - /* Manually track tainting, as we deal in individual chars below */ + case EOP_FROM_UTF8: + { + uschar * buff = store_get(4, is_tainted(sub)); + while (*sub) + { + int c; + GETUTF8INC(c, sub); + if (c > 255) c = '_'; + buff[0] = c; + yield = string_catn(yield, buff, 1); + } + break; + } - if (is_tainted(sub)) - { - if (yield->s && yield->ptr) - gstring_rebuffer(yield); - else - yield->s = store_get(yield->size = Ustrlen(sub), TRUE); - } + /* replace illegal UTF-8 sequences by replacement character */ - /* Check the UTF-8, byte-by-byte */ + #define UTF8_REPLACEMENT_CHAR US"?" - while (*sub) + case EOP_UTF8CLEAN: { - complete = 0; - uschar c = *sub++; + int seq_len = 0, index = 0; + int bytes_left = 0; + long codepoint = -1; + int complete; + uschar seq_buff[4]; /* accumulate utf-8 here */ + + /* Manually track tainting, as we deal in individual chars below */ - if (bytes_left) + if (is_tainted(sub)) { - if ((c & 0xc0) != 0x80) - /* wrong continuation byte; invalidate all bytes */ - complete = 1; /* error */ + if (yield->s && yield->ptr) + gstring_rebuffer(yield); else - { - codepoint = (codepoint << 6) | (c & 0x3f); - seq_buff[index++] = c; - if (--bytes_left == 0) /* codepoint complete */ - if(codepoint > 0x10FFFF) /* is it too large? */ - complete = -1; /* error (RFC3629 limit) */ - else - { /* finished; output utf-8 sequence */ - yield = string_catn(yield, seq_buff, seq_len); - index = 0; - } - } + yield->s = store_get(yield->size = Ustrlen(sub), is_tainted(sub)); } - else /* no bytes left: new sequence */ + + /* Check the UTF-8, byte-by-byte */ + + while (*sub) { - if(!(c & 0x80)) /* 1-byte sequence, US-ASCII, keep it */ - { - yield = string_catn(yield, &c, 1); - continue; - } - if((c & 0xe0) == 0xc0) /* 2-byte sequence */ + complete = 0; + uschar c = *sub++; + + if (bytes_left) { - if(c == 0xc0 || c == 0xc1) /* 0xc0 and 0xc1 are illegal */ - complete = -1; + if ((c & 0xc0) != 0x80) + /* wrong continuation byte; invalidate all bytes */ + complete = 1; /* error */ else { - bytes_left = 1; - codepoint = c & 0x1f; + codepoint = (codepoint << 6) | (c & 0x3f); + seq_buff[index++] = c; + if (--bytes_left == 0) /* codepoint complete */ + if(codepoint > 0x10FFFF) /* is it too large? */ + complete = -1; /* error (RFC3629 limit) */ + else + { /* finished; output utf-8 sequence */ + yield = string_catn(yield, seq_buff, seq_len); + index = 0; + } } } - else if((c & 0xf0) == 0xe0) /* 3-byte sequence */ + else /* no bytes left: new sequence */ { - bytes_left = 2; - codepoint = c & 0x0f; - } - else if((c & 0xf8) == 0xf0) /* 4-byte sequence */ + if(!(c & 0x80)) /* 1-byte sequence, US-ASCII, keep it */ + { + yield = string_catn(yield, &c, 1); + continue; + } + if((c & 0xe0) == 0xc0) /* 2-byte sequence */ + { + if(c == 0xc0 || c == 0xc1) /* 0xc0 and 0xc1 are illegal */ + complete = -1; + else + { + bytes_left = 1; + codepoint = c & 0x1f; + } + } + else if((c & 0xf0) == 0xe0) /* 3-byte sequence */ + { + bytes_left = 2; + codepoint = c & 0x0f; + } + else if((c & 0xf8) == 0xf0) /* 4-byte sequence */ + { + bytes_left = 3; + codepoint = c & 0x07; + } + else /* invalid or too long (RFC3629 allows only 4 bytes) */ + complete = -1; + + seq_buff[index++] = c; + seq_len = bytes_left + 1; + } /* if(bytes_left) */ + + if (complete != 0) { - bytes_left = 3; - codepoint = c & 0x07; + bytes_left = index = 0; + yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1); } - else /* invalid or too long (RFC3629 allows only 4 bytes) */ - complete = -1; + if ((complete == 1) && ((c & 0x80) == 0)) + /* ASCII character follows incomplete sequence */ + yield = string_catn(yield, &c, 1); + } + /* If given a sequence truncated mid-character, we also want to report ? + Eg, ${length_1:フィル} is one byte, not one character, so we expect + ${utf8clean:${length_1:フィル}} to yield '?' */ + + if (bytes_left != 0) + yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1); - seq_buff[index++] = c; - seq_len = bytes_left + 1; - } /* if(bytes_left) */ + break; + } - if (complete != 0) + #ifdef SUPPORT_I18N + case EOP_UTF8_DOMAIN_TO_ALABEL: + { + uschar * error = NULL; + uschar * s = string_domain_utf8_to_alabel(sub, &error); + if (error) { - bytes_left = index = 0; - yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1); + expand_string_message = string_sprintf( + "error converting utf8 (%s) to alabel: %s", + string_printing(sub), error); + goto EXPAND_FAILED; } - if ((complete == 1) && ((c & 0x80) == 0)) - /* ASCII character follows incomplete sequence */ - yield = string_catn(yield, &c, 1); + yield = string_cat(yield, s); + break; } - /* If given a sequence truncated mid-character, we also want to report ? - * Eg, ${length_1:フィル} is one byte, not one character, so we expect - * ${utf8clean:${length_1:フィル}} to yield '?' */ - if (bytes_left != 0) - yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1); - continue; - } - -#ifdef SUPPORT_I18N - case EOP_UTF8_DOMAIN_TO_ALABEL: - { - uschar * error = NULL; - uschar * s = string_domain_utf8_to_alabel(sub, &error); - if (error) + case EOP_UTF8_DOMAIN_FROM_ALABEL: { - expand_string_message = string_sprintf( - "error converting utf8 (%s) to alabel: %s", - string_printing(sub), error); - goto EXPAND_FAILED; + uschar * error = NULL; + uschar * s = string_domain_alabel_to_utf8(sub, &error); + if (error) + { + expand_string_message = string_sprintf( + "error converting alabel (%s) to utf8: %s", + string_printing(sub), error); + goto EXPAND_FAILED; + } + yield = string_cat(yield, s); + break; } - yield = string_cat(yield, s); - continue; - } - case EOP_UTF8_DOMAIN_FROM_ALABEL: - { - uschar * error = NULL; - uschar * s = string_domain_alabel_to_utf8(sub, &error); - if (error) + case EOP_UTF8_LOCALPART_TO_ALABEL: { - expand_string_message = string_sprintf( - "error converting alabel (%s) to utf8: %s", - string_printing(sub), error); - goto EXPAND_FAILED; + uschar * error = NULL; + uschar * s = string_localpart_utf8_to_alabel(sub, &error); + if (error) + { + expand_string_message = string_sprintf( + "error converting utf8 (%s) to alabel: %s", + string_printing(sub), error); + goto EXPAND_FAILED; + } + yield = string_cat(yield, s); + DEBUG(D_expand) debug_printf_indent("yield: '%s'\n", yield->s); + break; } - yield = string_cat(yield, s); - continue; - } - case EOP_UTF8_LOCALPART_TO_ALABEL: - { - uschar * error = NULL; - uschar * s = string_localpart_utf8_to_alabel(sub, &error); - if (error) + case EOP_UTF8_LOCALPART_FROM_ALABEL: { - expand_string_message = string_sprintf( - "error converting utf8 (%s) to alabel: %s", - string_printing(sub), error); - goto EXPAND_FAILED; + uschar * error = NULL; + uschar * s = string_localpart_alabel_to_utf8(sub, &error); + if (error) + { + expand_string_message = string_sprintf( + "error converting alabel (%s) to utf8: %s", + string_printing(sub), error); + goto EXPAND_FAILED; + } + yield = string_cat(yield, s); + break; } - yield = string_cat(yield, s); - DEBUG(D_expand) debug_printf_indent("yield: '%s'\n", yield->s); - continue; - } + #endif /* EXPERIMENTAL_INTERNATIONAL */ - case EOP_UTF8_LOCALPART_FROM_ALABEL: - { - uschar * error = NULL; - uschar * s = string_localpart_alabel_to_utf8(sub, &error); - if (error) + /* escape turns all non-printing characters into escape sequences. */ + + case EOP_ESCAPE: { - expand_string_message = string_sprintf( - "error converting alabel (%s) to utf8: %s", - string_printing(sub), error); - goto EXPAND_FAILED; + const uschar * t = string_printing(sub); + yield = string_cat(yield, t); + break; } - yield = string_cat(yield, s); - continue; - } -#endif /* EXPERIMENTAL_INTERNATIONAL */ - /* escape turns all non-printing characters into escape sequences. */ + case EOP_ESCAPE8BIT: + { + uschar c; - case EOP_ESCAPE: - { - const uschar * t = string_printing(sub); - yield = string_cat(yield, t); - continue; - } + for (const uschar * s = sub; (c = *s); s++) + yield = c < 127 && c != '\\' + ? string_catn(yield, s, 1) + : string_fmt_append(yield, "\\%03o", c); + break; + } - case EOP_ESCAPE8BIT: - { - uschar c; + /* Handle numeric expression evaluation */ - for (const uschar * s = sub; (c = *s); s++) - yield = c < 127 && c != '\\' - ? string_catn(yield, s, 1) - : string_fmt_append(yield, "\\%03o", c); - continue; - } + case EOP_EVAL: + case EOP_EVAL10: + { + uschar *save_sub = sub; + uschar *error = NULL; + int_eximarith_t n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE); + if (error) + { + expand_string_message = string_sprintf("error in expression " + "evaluation: %s (after processing \"%.*s\")", error, + (int)(sub-save_sub), save_sub); + goto EXPAND_FAILED; + } + yield = string_fmt_append(yield, PR_EXIM_ARITH, n); + break; + } - /* Handle numeric expression evaluation */ + /* Handle time period formatting */ - case EOP_EVAL: - case EOP_EVAL10: - { - uschar *save_sub = sub; - uschar *error = NULL; - int_eximarith_t n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE); - if (error) - { - expand_string_message = string_sprintf("error in expression " - "evaluation: %s (after processing \"%.*s\")", error, - (int)(sub-save_sub), save_sub); - goto EXPAND_FAILED; - } - yield = string_fmt_append(yield, PR_EXIM_ARITH, n); - continue; - } + case EOP_TIME_EVAL: + { + int n = readconf_readtime(sub, 0, FALSE); + if (n < 0) + { + expand_string_message = string_sprintf("string \"%s\" is not an " + "Exim time interval in \"%s\" operator", sub, name); + goto EXPAND_FAILED; + } + yield = string_fmt_append(yield, "%d", n); + break; + } - /* Handle time period formatting */ + case EOP_TIME_INTERVAL: + { + int n; + uschar *t = read_number(&n, sub); + if (*t != 0) /* Not A Number*/ + { + expand_string_message = string_sprintf("string \"%s\" is not a " + "positive number in \"%s\" operator", sub, name); + goto EXPAND_FAILED; + } + t = readconf_printtime(n); + yield = string_cat(yield, t); + break; + } - case EOP_TIME_EVAL: - { - int n = readconf_readtime(sub, 0, FALSE); - if (n < 0) - { - expand_string_message = string_sprintf("string \"%s\" is not an " - "Exim time interval in \"%s\" operator", sub, name); - goto EXPAND_FAILED; - } - yield = string_fmt_append(yield, "%d", n); - continue; - } + /* Convert string to base64 encoding */ - case EOP_TIME_INTERVAL: - { - int n; - uschar *t = read_number(&n, sub); - if (*t != 0) /* Not A Number*/ - { - expand_string_message = string_sprintf("string \"%s\" is not a " - "positive number in \"%s\" operator", sub, name); - goto EXPAND_FAILED; - } - t = readconf_printtime(n); - yield = string_cat(yield, t); - continue; - } + case EOP_STR2B64: + case EOP_BASE64: + { + #ifndef DISABLE_TLS + uschar * s = vp && *(void **)vp->value + ? tls_cert_der_b64(*(void **)vp->value) + : b64encode(CUS sub, Ustrlen(sub)); + #else + uschar * s = b64encode(CUS sub, Ustrlen(sub)); + #endif + yield = string_cat(yield, s); + break; + } - /* Convert string to base64 encoding */ + case EOP_BASE64D: + { + uschar * s; + int len = b64decode(sub, &s); + if (len < 0) + { + expand_string_message = string_sprintf("string \"%s\" is not " + "well-formed for \"%s\" operator", sub, name); + goto EXPAND_FAILED; + } + yield = string_cat(yield, s); + break; + } - case EOP_STR2B64: - case EOP_BASE64: - { -#ifndef DISABLE_TLS - uschar * s = vp && *(void **)vp->value - ? tls_cert_der_b64(*(void **)vp->value) - : b64encode(CUS sub, Ustrlen(sub)); -#else - uschar * s = b64encode(CUS sub, Ustrlen(sub)); -#endif - yield = string_cat(yield, s); - continue; - } + /* strlen returns the length of the string */ - case EOP_BASE64D: - { - uschar * s; - int len = b64decode(sub, &s); - if (len < 0) - { - expand_string_message = string_sprintf("string \"%s\" is not " - "well-formed for \"%s\" operator", sub, name); - goto EXPAND_FAILED; - } - yield = string_cat(yield, s); - continue; - } + case EOP_STRLEN: + yield = string_fmt_append(yield, "%d", Ustrlen(sub)); + break; - /* strlen returns the length of the string */ + /* length_n or l_n takes just the first n characters or the whole string, + whichever is the shorter; + + substr_m_n, and s_m_n take n characters from offset m; negative m take + from the end; l_n is synonymous with s_0_n. If n is omitted in substr it + takes the rest, either to the right or to the left. + + hash_n or h_n makes a hash of length n from the string, yielding n + characters from the set a-z; hash_n_m makes a hash of length n, but + uses m characters from the set a-zA-Z0-9. + + nhash_n returns a single number between 0 and n-1 (in text form), while + nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies + between 0 and n-1 and the second between 0 and m-1. */ + + case EOP_LENGTH: + case EOP_L: + case EOP_SUBSTR: + case EOP_S: + case EOP_HASH: + case EOP_H: + case EOP_NHASH: + case EOP_NH: + { + int sign = 1; + int value1 = 0; + int value2 = -1; + int *pn; + int len; + uschar *ret; - case EOP_STRLEN: - yield = string_fmt_append(yield, "%d", Ustrlen(sub)); - continue; + if (!arg) + { + expand_string_message = string_sprintf("missing values after %s", + name); + goto EXPAND_FAILED; + } - /* length_n or l_n takes just the first n characters or the whole string, - whichever is the shorter; - - substr_m_n, and s_m_n take n characters from offset m; negative m take - from the end; l_n is synonymous with s_0_n. If n is omitted in substr it - takes the rest, either to the right or to the left. - - hash_n or h_n makes a hash of length n from the string, yielding n - characters from the set a-z; hash_n_m makes a hash of length n, but - uses m characters from the set a-zA-Z0-9. - - nhash_n returns a single number between 0 and n-1 (in text form), while - nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies - between 0 and n-1 and the second between 0 and m-1. */ - - case EOP_LENGTH: - case EOP_L: - case EOP_SUBSTR: - case EOP_S: - case EOP_HASH: - case EOP_H: - case EOP_NHASH: - case EOP_NH: - { - int sign = 1; - int value1 = 0; - int value2 = -1; - int *pn; - int len; - uschar *ret; - - if (!arg) - { - expand_string_message = string_sprintf("missing values after %s", - name); - goto EXPAND_FAILED; - } + /* "length" has only one argument, effectively being synonymous with + substr_0_n. */ - /* "length" has only one argument, effectively being synonymous with - substr_0_n. */ + if (c == EOP_LENGTH || c == EOP_L) + { + pn = &value2; + value2 = 0; + } - if (c == EOP_LENGTH || c == EOP_L) - { - pn = &value2; - value2 = 0; - } + /* The others have one or two arguments; for "substr" the first may be + negative. The second being negative means "not supplied". */ - /* The others have one or two arguments; for "substr" the first may be - negative. The second being negative means "not supplied". */ + else + { + pn = &value1; + if (name[0] == 's' && *arg == '-') { sign = -1; arg++; } + } - else - { - pn = &value1; - if (name[0] == 's' && *arg == '-') { sign = -1; arg++; } - } + /* Read up to two numbers, separated by underscores */ - /* Read up to two numbers, separated by underscores */ + ret = arg; + while (*arg != 0) + { + if (arg != ret && *arg == '_' && pn == &value1) + { + pn = &value2; + value2 = 0; + if (arg[1] != 0) arg++; + } + else if (!isdigit(*arg)) + { + expand_string_message = + string_sprintf("non-digit after underscore in \"%s\"", name); + goto EXPAND_FAILED; + } + else *pn = (*pn)*10 + *arg++ - '0'; + } + value1 *= sign; - ret = arg; - while (*arg != 0) - { - if (arg != ret && *arg == '_' && pn == &value1) - { - pn = &value2; - value2 = 0; - if (arg[1] != 0) arg++; - } - else if (!isdigit(*arg)) - { - expand_string_message = - string_sprintf("non-digit after underscore in \"%s\"", name); - goto EXPAND_FAILED; - } - else *pn = (*pn)*10 + *arg++ - '0'; - } - value1 *= sign; + /* Perform the required operation */ - /* Perform the required operation */ + ret = c == EOP_HASH || c == EOP_H + ? compute_hash(sub, value1, value2, &len) + : c == EOP_NHASH || c == EOP_NH + ? compute_nhash(sub, value1, value2, &len) + : extract_substr(sub, value1, value2, &len); + if (!ret) goto EXPAND_FAILED; - ret = c == EOP_HASH || c == EOP_H - ? compute_hash(sub, value1, value2, &len) - : c == EOP_NHASH || c == EOP_NH - ? compute_nhash(sub, value1, value2, &len) - : extract_substr(sub, value1, value2, &len); - if (!ret) goto EXPAND_FAILED; + yield = string_catn(yield, ret, len); + break; + } - yield = string_catn(yield, ret, len); - continue; - } + /* Stat a path */ - /* Stat a path */ + case EOP_STAT: + { + uschar smode[12]; + uschar **modetable[3]; + mode_t mode; + struct stat st; - case EOP_STAT: - { - uschar smode[12]; - uschar **modetable[3]; - mode_t mode; - struct stat st; + if (expand_forbid & RDO_EXISTS) + { + expand_string_message = US"Use of the stat() expansion is not permitted"; + goto EXPAND_FAILED; + } - if (expand_forbid & RDO_EXISTS) - { - expand_string_message = US"Use of the stat() expansion is not permitted"; - goto EXPAND_FAILED; - } + if (stat(CS sub, &st) < 0) + { + expand_string_message = string_sprintf("stat(%s) failed: %s", + sub, strerror(errno)); + goto EXPAND_FAILED; + } + mode = st.st_mode; + switch (mode & S_IFMT) + { + case S_IFIFO: smode[0] = 'p'; break; + case S_IFCHR: smode[0] = 'c'; break; + case S_IFDIR: smode[0] = 'd'; break; + case S_IFBLK: smode[0] = 'b'; break; + case S_IFREG: smode[0] = '-'; break; + default: smode[0] = '?'; break; + } - if (stat(CS sub, &st) < 0) - { - expand_string_message = string_sprintf("stat(%s) failed: %s", - sub, strerror(errno)); - goto EXPAND_FAILED; - } - mode = st.st_mode; - switch (mode & S_IFMT) - { - case S_IFIFO: smode[0] = 'p'; break; - case S_IFCHR: smode[0] = 'c'; break; - case S_IFDIR: smode[0] = 'd'; break; - case S_IFBLK: smode[0] = 'b'; break; - case S_IFREG: smode[0] = '-'; break; - default: smode[0] = '?'; break; - } + modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky; + modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid; + modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid; - modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky; - modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid; - modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid; + for (int i = 0; i < 3; i++) + { + memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3); + mode >>= 3; + } - for (int i = 0; i < 3; i++) - { - memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3); - mode >>= 3; - } + smode[10] = 0; + yield = string_fmt_append(yield, + "mode=%04lo smode=%s inode=%ld device=%ld links=%ld " + "uid=%ld gid=%ld size=" OFF_T_FMT " atime=%ld mtime=%ld ctime=%ld", + (long)(st.st_mode & 077777), smode, (long)st.st_ino, + (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid, + (long)st.st_gid, st.st_size, (long)st.st_atime, + (long)st.st_mtime, (long)st.st_ctime); + break; + } - smode[10] = 0; - yield = string_fmt_append(yield, - "mode=%04lo smode=%s inode=%ld device=%ld links=%ld " - "uid=%ld gid=%ld size=" OFF_T_FMT " atime=%ld mtime=%ld ctime=%ld", - (long)(st.st_mode & 077777), smode, (long)st.st_ino, - (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid, - (long)st.st_gid, st.st_size, (long)st.st_atime, - (long)st.st_mtime, (long)st.st_ctime); - continue; - } + /* vaguely random number less than N */ - /* vaguely random number less than N */ + case EOP_RANDINT: + { + int_eximarith_t max = expanded_string_integer(sub, TRUE); - case EOP_RANDINT: - { - int_eximarith_t max = expanded_string_integer(sub, TRUE); + if (expand_string_message) + goto EXPAND_FAILED; + yield = string_fmt_append(yield, "%d", vaguely_random_number((int)max)); + break; + } - if (expand_string_message) - goto EXPAND_FAILED; - yield = string_fmt_append(yield, "%d", vaguely_random_number((int)max)); - continue; - } + /* Reverse IP, including IPv6 to dotted-nibble */ - /* Reverse IP, including IPv6 to dotted-nibble */ + case EOP_REVERSE_IP: + { + int family, maskptr; + uschar reversed[128]; - case EOP_REVERSE_IP: - { - int family, maskptr; - uschar reversed[128]; + family = string_is_ip_address(sub, &maskptr); + if (family == 0) + { + expand_string_message = string_sprintf( + "reverse_ip() not given an IP address [%s]", sub); + goto EXPAND_FAILED; + } + invert_address(reversed, sub); + yield = string_cat(yield, reversed); + break; + } - family = string_is_ip_address(sub, &maskptr); - if (family == 0) - { - expand_string_message = string_sprintf( - "reverse_ip() not given an IP address [%s]", sub); - goto EXPAND_FAILED; - } - invert_address(reversed, sub); - yield = string_cat(yield, reversed); - continue; - } + /* Unknown operator */ - /* Unknown operator */ + default: + expand_string_message = + string_sprintf("unknown expansion operator \"%s\"", name); + goto EXPAND_FAILED; + } /* EOP_* switch */ - default: - expand_string_message = - string_sprintf("unknown expansion operator \"%s\"", name); - goto EXPAND_FAILED; - } + DEBUG(D_expand) + { + const uschar * s = yield->s + start; + int i = yield->ptr - start; + BOOL tainted = is_tainted(s); + + DEBUG(D_noutf8) + { + debug_printf_indent("|-----op-res: %.*s\n", i, s); + if (tainted) + { + debug_printf_indent("%s \\__", skipping ? "| " : " "); + debug_printf("(tainted)\n"); + } + } + else + { + debug_printf_indent(UTF8_VERT_RIGHT + UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ UTF8_HORIZ + "op-res: %.*s\n", i, s); + if (tainted) + { + debug_printf_indent("%s", + skipping + ? UTF8_VERT " " : " " UTF8_UP_RIGHT UTF8_HORIZ UTF8_HORIZ); + debug_printf("(tainted)\n"); + } + } + } + continue; + } } + /* Not an item or an operator */ /* Handle a plain name. If this is the first thing in the expansion, release the pre-allocated buffer. If the result data is known to be in a new buffer, newsize will be set to the size of that buffer, and we can just point at that @@ -8154,7 +8224,7 @@ while (*s) /* If we hit the end of the string when ket_ends is set, there is a missing terminating brace. */ -if (ket_ends && *s == 0) +if (ket_ends && !*s) { expand_string_message = malformed_header ? US"missing } at end of string - could be header name not terminated by colon" diff --git a/test/runtest b/test/runtest index cda11da9e..6cc5b3bdb 100755 --- a/test/runtest +++ b/test/runtest @@ -1285,6 +1285,9 @@ RESET_AFTER_EXTRA_LINE_READ: $_ = $line . $_; } + # Different builds will have different lookup types included + s/^search_type \K\d+ \((\w+)\) quoting -1 \(none\)$/NN ($1) quoting -1 (none)/; + # DISABLE_OCSP next if /in hosts_requ(est|ire)_ocsp\? (no|yes)/; diff --git a/test/stderr/0002 b/test/stderr/0002 index 0c34e84c3..81108f28f 100644 --- a/test/stderr/0002 +++ b/test/stderr/0002 @@ -3,36 +3,56 @@ configuration file is TESTSUITE/test-config admin user dropping to exim gid; retaining priv uid ╭considering: primary_hostname: $primary_hostname + ├───────text: primary_hostname: + ├considering: $primary_hostname ├──expanding: primary_hostname: $primary_hostname ╰─────result: primary_hostname: myhost.test.ex ╭considering: sender_address: $sender_address + ├───────text: sender_address: + ├considering: $sender_address ├──expanding: sender_address: $sender_address ╰─────result: sender_address: sndr@dom ╰──(tainted) ╭considering: match: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + ├───────text: match: + ├considering: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} ╭considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + ├───────text: abcd + ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail} ├──expanding: abcd ╰─────result: abcd ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail} + ├──protected: ^([ab]+)(\w+)$ + ├considering: }{$2$1}fail} ├──expanding: \N^([ab]+)(\w+)$\N ╰─────result: ^([ab]+)(\w+)$ ├──condition: match{abcd}{\N^([ab]+)(\w+)$\N} ├─────result: true ╭considering: $2$1}fail} + ├considering: $1}fail} + ├considering: }fail} ├──expanding: $2$1 ╰─────result: cdab ├──expanding: match: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} ╰─────result: match: cdab ╭considering: match: ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + ├───────text: match: + ├considering: ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} ╭considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + ├───────text: wxyz + ├considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail} ├──expanding: wxyz ╰─────result: wxyz ╭considering: \N^([ab]+)(\w+)$\N}{$2$1}fail} + ├──protected: ^([ab]+)(\w+)$ + ├considering: }{$2$1}fail} ├──expanding: \N^([ab]+)(\w+)$\N ╰─────result: ^([ab]+)(\w+)$ ├──condition: match{wxyz}{\N^([ab]+)(\w+)$\N} ├─────result: false ╭───scanning: $2$1}fail} + ├───scanning: $1}fail} + ├───scanning: }fail} ├──expanding: $2$1 ├─────result: ╰───skipping: result is not used @@ -41,35 +61,52 @@ dropping to exim gid; retaining priv uid ╰failure was forced ╭considering: ${if eq {1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} ╭considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} + ├───────text: 1 + ├considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} ├──expanding: 1 ╰─────result: 1 ╭considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}} + ├───────text: 1 + ├considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}} ├──expanding: 1 ╰─────result: 1 ├──condition: eq {1}{1} ├─────result: true ╭considering: yes}{${lookup{xx}lsearch{/non/exist}}}} + ├───────text: yes + ├considering: }{${lookup{xx}lsearch{/non/exist}}}} ├──expanding: yes ╰─────result: yes ╭───scanning: ${lookup{xx}lsearch{/non/exist}}}} ╭───scanning: xx}lsearch{/non/exist}}}} + ├───────text: xx + ├───scanning: }lsearch{/non/exist}}}} ├──expanding: xx ├─────result: xx ╰───skipping: result is not used ╭───scanning: /non/exist}}}} + ├───────text: /non/exist + ├───scanning: }}}} ├──expanding: /non/exist ├─────result: /non/exist ╰───skipping: result is not used + ├───scanning: }} ├──expanding: ${lookup{xx}lsearch{/non/exist}} ├─────result: ╰───skipping: result is not used ├──expanding: ${if eq {1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} ╰─────result: yes ╭considering: match_address: ${if match_address{a.b.c}{a.b.c}{yes}{no}} + ├───────text: match_address: + ├considering: ${if match_address{a.b.c}{a.b.c}{yes}{no}} ╭considering: a.b.c}{a.b.c}{yes}{no}} + ├───────text: a.b.c + ├considering: }{a.b.c}{yes}{no}} ├──expanding: a.b.c ╰─────result: a.b.c ╭considering: a.b.c}{yes}{no}} + ├───────text: a.b.c + ├considering: }{yes}{no}} ├──expanding: a.b.c ╰─────result: a.b.c LOG: MAIN PANIC @@ -77,10 +114,14 @@ LOG: MAIN PANIC ├──condition: match_address{a.b.c}{a.b.c} ├─────result: false ╭───scanning: yes}{no}} + ├───────text: yes + ├───scanning: }{no}} ├──expanding: yes ├─────result: yes ╰───skipping: result is not used ╭considering: no}} + ├───────text: no + ├considering: }} ├──expanding: no ╰─────result: no ├──expanding: match_address: ${if match_address{a.b.c}{a.b.c}{yes}{no}} @@ -91,32 +132,50 @@ configuration file is TESTSUITE/test-config admin user dropping to exim gid; retaining priv uid /considering: primary_hostname: $primary_hostname + |-------text: primary_hostname: + |considering: $primary_hostname |--expanding: primary_hostname: $primary_hostname \_____result: primary_hostname: myhost.test.ex /considering: match: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + |-------text: match: + |considering: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} /considering: abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + |-------text: abcd + |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail} |--expanding: abcd \_____result: abcd /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail} + |--protected: ^([ab]+)(\w+)$ + |considering: }{$2$1}fail} |--expanding: \N^([ab]+)(\w+)$\N \_____result: ^([ab]+)(\w+)$ |--condition: match{abcd}{\N^([ab]+)(\w+)$\N} |-----result: true /considering: $2$1}fail} + |considering: $1}fail} + |considering: }fail} |--expanding: $2$1 \_____result: cdab |--expanding: match: ${if match{abcd}{\N^([ab]+)(\w+)$\N}{$2$1}fail} \_____result: match: cdab /considering: match: ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + |-------text: match: + |considering: ${if match{wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} /considering: wxyz}{\N^([ab]+)(\w+)$\N}{$2$1}fail} + |-------text: wxyz + |considering: }{\N^([ab]+)(\w+)$\N}{$2$1}fail} |--expanding: wxyz \_____result: wxyz /considering: \N^([ab]+)(\w+)$\N}{$2$1}fail} + |--protected: ^([ab]+)(\w+)$ + |considering: }{$2$1}fail} |--expanding: \N^([ab]+)(\w+)$\N \_____result: ^([ab]+)(\w+)$ |--condition: match{wxyz}{\N^([ab]+)(\w+)$\N} |-----result: false /---scanning: $2$1}fail} + |---scanning: $1}fail} + |---scanning: }fail} |--expanding: $2$1 |-----result: \___skipping: result is not used @@ -125,35 +184,52 @@ dropping to exim gid; retaining priv uid \failure was forced /considering: ${if eq {1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} /considering: 1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} + |-------text: 1 + |considering: }{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} |--expanding: 1 \_____result: 1 /considering: 1}{yes}{${lookup{xx}lsearch{/non/exist}}}} + |-------text: 1 + |considering: }{yes}{${lookup{xx}lsearch{/non/exist}}}} |--expanding: 1 \_____result: 1 |--condition: eq {1}{1} |-----result: true /considering: yes}{${lookup{xx}lsearch{/non/exist}}}} + |-------text: yes + |considering: }{${lookup{xx}lsearch{/non/exist}}}} |--expanding: yes \_____result: yes /---scanning: ${lookup{xx}lsearch{/non/exist}}}} /---scanning: xx}lsearch{/non/exist}}}} + |-------text: xx + |---scanning: }lsearch{/non/exist}}}} |--expanding: xx |-----result: xx \___skipping: result is not used /---scanning: /non/exist}}}} + |-------text: /non/exist + |---scanning: }}}} |--expanding: /non/exist |-----result: /non/exist \___skipping: result is not used + |---scanning: }} |--expanding: ${lookup{xx}lsearch{/non/exist}} |-----result: \___skipping: result is not used |--expanding: ${if eq {1}{1}{yes}{${lookup{xx}lsearch{/non/exist}}}} \_____result: yes /considering: match_address: ${if match_address{a.b.c}{a.b.c}{yes}{no}} + |-------text: match_address: + |considering: ${if match_address{a.b.c}{a.b.c}{yes}{no}} /considering: a.b.c}{a.b.c}{yes}{no}} + |-------text: a.b.c + |considering: }{a.b.c}{yes}{no}} |--expanding: a.b.c \_____result: a.b.c /considering: a.b.c}{yes}{no}} + |-------text: a.b.c + |considering: }{yes}{no}} |--expanding: a.b.c \_____result: a.b.c LOG: MAIN PANIC @@ -161,10 +237,14 @@ LOG: MAIN PANIC |--condition: match_address{a.b.c}{a.b.c} |-----result: false /---scanning: yes}{no}} + |-------text: yes + |---scanning: }{no}} |--expanding: yes |-----result: yes \___skipping: result is not used /considering: no}} + |-------text: no + |considering: }} |--expanding: no \_____result: no |--expanding: match_address: ${if match_address{a.b.c}{a.b.c}{yes}{no}} @@ -175,36 +255,54 @@ configuration file is TESTSUITE/test-config admin user dropping to exim gid; retaining priv uid ╭considering: -oMa sender_host_address = $sender_host_address + ├───────text: -oMa sender_host_address = + ├considering: $sender_host_address ├──expanding: -oMa sender_host_address = $sender_host_address ╰─────result: -oMa sender_host_address = V4NET.0.0.1 ╰──(tainted) ╭considering: sender_host_port = $sender_host_port + ├───────text: sender_host_port = + ├considering: $sender_host_port ├──expanding: sender_host_port = $sender_host_port ╰─────result: sender_host_port = 1234 ╭considering: -oMaa sender_host_authenticated = $sender_host_authenticated + ├───────text: -oMaa sender_host_authenticated = + ├considering: $sender_host_authenticated ├──expanding: -oMaa sender_host_authenticated = $sender_host_authenticated ╰─────result: -oMaa sender_host_authenticated = AAA ╰──(tainted) ╭considering: -oMai authenticated_id = $authenticated_id + ├───────text: -oMai authenticated_id = + ├considering: $authenticated_id ├──expanding: -oMai authenticated_id = $authenticated_id ╰─────result: -oMai authenticated_id = philip ╰──(tainted) ╭considering: -oMas authenticated_sender = $authenticated_sender + ├───────text: -oMas authenticated_sender = + ├considering: $authenticated_sender ├──expanding: -oMas authenticated_sender = $authenticated_sender ╰─────result: -oMas authenticated_sender = xx@yy.zz ╰──(tainted) ╭considering: -oMi interface_address = $interface_address + ├───────text: -oMi interface_address = + ├considering: $interface_address ├──expanding: -oMi interface_address = $interface_address ╰─────result: -oMi interface_address = 1.1.1.1 ╰──(tainted) ╭considering: interface_port = $interface_port + ├───────text: interface_port = + ├considering: $interface_port ├──expanding: interface_port = $interface_port ╰─────result: interface_port = 99 ╭considering: -oMr received_protocol = $received_protocol + ├───────text: -oMr received_protocol = + ├considering: $received_protocol ├──expanding: -oMr received_protocol = $received_protocol ╰─────result: -oMr received_protocol = special ╰──(tainted) ╭considering: -oMt sender_ident = $sender_ident + ├───────text: -oMt sender_ident = + ├considering: $sender_ident ├──expanding: -oMt sender_ident = $sender_ident ╰─────result: -oMt sender_ident = me ╰──(tainted) @@ -215,54 +313,81 @@ configuration file is TESTSUITE/test-config admin user dropping to exim gid; retaining priv uid ╭considering: -oMa sender_host_address = $sender_host_address + ├───────text: -oMa sender_host_address = + ├considering: $sender_host_address ├──expanding: -oMa sender_host_address = $sender_host_address ╰─────result: -oMa sender_host_address = V4NET.0.0.1 ╰──(tainted) ╭considering: sender_host_port = $sender_host_port + ├───────text: sender_host_port = + ├considering: $sender_host_port ├──expanding: sender_host_port = $sender_host_port ╰─────result: sender_host_port = 1234 ╭considering: -oMaa sender_host_authenticated = $sender_host_authenticated + ├───────text: -oMaa sender_host_authenticated = + ├considering: $sender_host_authenticated ├──expanding: -oMaa sender_host_authenticated = $sender_host_authenticated ╰─────result: -oMaa sender_host_authenticated = AAA ╰──(tainted) ╭considering: -oMai authenticated_id = $authenticated_id + ├───────text: -oMai authenticated_id = + ├considering: $authenticated_id ├──expanding: -oMai authenticated_id = $authenticated_id ╰─────result: -oMai authenticated_id = philip ╰──(tainted) ╭considering: -oMas authenticated_sender = $authenticated_sender + ├───────text: -oMas authenticated_sender = + ├considering: $authenticated_sender ├──expanding: -oMas authenticated_sender = $authenticated_sender ╰─────result: -oMas authenticated_sender = xx@yy.zz ╰──(tainted) ╭considering: -oMi interface_address = $interface_address + ├───────text: -oMi interface_address = + ├considering: $interface_address ├──expanding: -oMi interface_address = $interface_address ╰─────result: -oMi interface_address = 1.1.1.1 ╰──(tainted) ╭considering: interface_port = $interface_port + ├───────text: interface_port = + ├considering: $interface_port ├──expanding: interface_port = $interface_port ╰─────result: interface_port = 99 ╭considering: -oMr received_protocol = $received_protocol + ├───────text: -oMr received_protocol = + ├considering: $received_protocol ├──expanding: -oMr received_protocol = $received_protocol ╰─────result: -oMr received_protocol = special ╰──(tainted) ╭considering: ----> No lookup yet: ${if eq{black}{white}{$sender_host_name}{No}} + ├───────text: ----> No lookup yet: + ├considering: ${if eq{black}{white}{$sender_host_name}{No}} ╭considering: black}{white}{$sender_host_name}{No}} + ├───────text: black + ├considering: }{white}{$sender_host_name}{No}} ├──expanding: black ╰─────result: black ╭considering: white}{$sender_host_name}{No}} + ├───────text: white + ├considering: }{$sender_host_name}{No}} ├──expanding: white ╰─────result: white ├──condition: eq{black}{white} ├─────result: false ╭───scanning: $sender_host_name}{No}} + ├───scanning: }{No}} ├──expanding: $sender_host_name ├─────result: ╰───skipping: result is not used ╭considering: No}} + ├───────text: No + ├considering: }} ├──expanding: No ╰─────result: No ├──expanding: ----> No lookup yet: ${if eq{black}{white}{$sender_host_name}{No}} ╰─────result: ----> No lookup yet: No ╭considering: -oMs sender_host_name = $sender_host_name + ├───────text: -oMs sender_host_name = + ├considering: $sender_host_name looking up host name for V4NET.0.0.1 IP address lookup yielded "ten-1.test.ex" ten-1.test.ex V4NET.0.0.1 mx=-1 sort=xx @@ -274,6 +399,8 @@ sender_rcvhost = ten-1.test.ex ([V4NET.0.0.1] ident=me) ╰─────result: -oMs sender_host_name = ten-1.test.ex ╰──(tainted) ╭considering: -oMt sender_ident = $sender_ident + ├───────text: -oMt sender_ident = + ├considering: $sender_ident ├──expanding: -oMt sender_ident = $sender_ident ╰─────result: -oMt sender_ident = me ╰──(tainted) diff --git a/test/stderr/0092 b/test/stderr/0092 index 2d6b02a9b..c2bfdd759 100644 --- a/test/stderr/0092 +++ b/test/stderr/0092 @@ -52,20 +52,29 @@ host in host_lookup? no (option unset) set_process_info: pppp handling incoming connection from [V4NET.0.0.1] ╭considering: ${if eq {V4NET.0.0.1} {$sender_host_address} {2} {30}}s ╭considering: V4NET.0.0.1} {$sender_host_address} {2} {30}}s + ├───────text: V4NET.0.0.1 + ├considering: } {$sender_host_address} {2} {30}}s ├──expanding: V4NET.0.0.1 ╰─────result: V4NET.0.0.1 ╭considering: $sender_host_address} {2} {30}}s + ├considering: } {2} {30}}s ├──expanding: $sender_host_address ╰─────result: V4NET.0.0.1 ├──condition: eq {V4NET.0.0.1} {$sender_host_address} ├─────result: true ╭considering: 2} {30}}s + ├───────text: 2 + ├considering: } {30}}s ├──expanding: 2 ╰─────result: 2 ╭───scanning: 30}}s + ├───────text: 30 + ├───scanning: }}s ├──expanding: 30 ├─────result: 30 ╰───skipping: result is not used + ├considering: s + ├───────text: s ├──expanding: ${if eq {V4NET.0.0.1} {$sender_host_address} {2} {30}}s ╰─────result: 2s host in host_reject_connection? no (option unset) @@ -75,6 +84,12 @@ host in helo_verify_hosts? no (option unset) host in helo_try_verify_hosts? no (option unset) host in helo_accept_junk_hosts? no (option unset) ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 SMTP>> 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 diff --git a/test/stderr/0402 b/test/stderr/0402 index a87765c45..92b6e9489 100644 --- a/test/stderr/0402 +++ b/test/stderr/0402 @@ -47,6 +47,14 @@ Data file written for message 10HmaX-0005vi-00 ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -56,6 +64,29 @@ Data file written for message 10HmaX-0005vi-00 ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -75,16 +106,49 @@ Data file written for message 10HmaX-0005vi-00 ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: false ╭───scanning: (helo=$sender_helo_name) @@ -93,14 +157,61 @@ Data file written for message 10HmaX-0005vi-00 ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├───scanning: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├───scanning: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ├─────result: (helo=) ╰───skipping: result is not used + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -108,21 +219,122 @@ Data file written for message 10HmaX-0005vi-00 ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: false ╭───scanning: for $received_for}} + ├───────text: + for + ├───scanning: $received_for}} + ├───scanning: }} ├──expanding: for $received_for ├─────result: @@ -265,6 +477,8 @@ stripped prefix rd+ checking local_parts usery in "usery"? yes (matched "usery") ╭considering: /non-exist/$domain + ├───────text: /non-exist/ + ├considering: $domain ├──expanding: /non-exist/$domain ╰─────result: /non-exist/test.ex ╰──(tainted) @@ -305,6 +519,8 @@ stripped prefix rd+ checking local_parts CALLER in "CALLER"? yes (matched "CALLER") ╭considering: /non-exist/$local_part + ├───────text: /non-exist/ + ├considering: $local_part ├──expanding: /non-exist/$local_part ╰─────result: /non-exist/CALLER ╰──(tainted) @@ -339,6 +555,8 @@ local_part=userz domain=test.ex checking local_parts userz in "userz"? yes (matched "userz") ╭considering: /non-exist/$domain + ├───────text: /non-exist/ + ├considering: $domain ├──expanding: /non-exist/$domain ╰─────result: /non-exist/test.ex ╰──(tainted) @@ -365,6 +583,8 @@ local_part=usery domain=test.ex checking local_parts usery in "usery"? yes (matched "usery") ╭considering: /non-exist/$domain + ├───────text: /non-exist/ + ├considering: $domain ├──expanding: /non-exist/$domain ╰─────result: /non-exist/test.ex ╰──(tainted) @@ -386,6 +606,8 @@ local_part=CALLER domain=test.ex checking local_parts CALLER in "CALLER"? yes (matched "CALLER") ╭considering: /non-exist/$local_part + ├───────text: /non-exist/ + ├considering: $local_part ├──expanding: /non-exist/$local_part ╰─────result: /non-exist/CALLER ╰──(tainted) @@ -435,6 +657,8 @@ search_tidyup called failed to open DB file TESTSUITE/spool/db/retry: No such file or directory no retry data available ╭considering: /non-exist/$local_part + ├───────text: /non-exist/ + ├considering: $local_part ├──expanding: /non-exist/$local_part ╰─────result: /non-exist/usery ╰──(tainted) @@ -460,18 +684,35 @@ mailbox TESTSUITE/test-mail/junk is locked writing to file TESTSUITE/test-mail/junk ╭considering: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├───────text: From + ├considering: ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├──condition: def:return_path ├─────result: true ╭considering: $return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├considering: }{MAILER-DAEMON}} ${tod_bsdinbox} + ├──expanding: $return_path ╰─────result: CALLER@test.ex ╰──(tainted) ╭───scanning: MAILER-DAEMON}} ${tod_bsdinbox} + ├───────text: MAILER-DAEMON + ├───scanning: }} ${tod_bsdinbox} + ├──expanding: MAILER-DAEMON ├─────result: MAILER-DAEMON ╰───skipping: result is not used + ├considering: ${tod_bsdinbox} + + ├───────text: + ├considering: ${tod_bsdinbox} + + ├considering: + + ├───────text: + ├──expanding: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} ╰─────result: From CALLER@test.ex Tue Mar 02 09:44:33 1999 @@ -519,18 +760,35 @@ mailbox TESTSUITE/test-mail/junk is locked writing to file TESTSUITE/test-mail/junk ╭considering: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├───────text: From + ├considering: ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├──condition: def:return_path ├─────result: true ╭considering: $return_path}{MAILER-DAEMON}} ${tod_bsdinbox} + ├considering: }{MAILER-DAEMON}} ${tod_bsdinbox} + ├──expanding: $return_path ╰─────result: CALLER@test.ex ╰──(tainted) ╭───scanning: MAILER-DAEMON}} ${tod_bsdinbox} + ├───────text: MAILER-DAEMON + ├───scanning: }} ${tod_bsdinbox} + ├──expanding: MAILER-DAEMON ├─────result: MAILER-DAEMON ╰───skipping: result is not used + ├considering: ${tod_bsdinbox} + + ├───────text: + ├considering: ${tod_bsdinbox} + + ├considering: + + ├───────text: + ├──expanding: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox} ╰─────result: From CALLER@test.ex Tue Mar 02 09:44:33 1999 @@ -583,6 +841,8 @@ LOG: MAIN failed to open DB file TESTSUITE/spool/db/retry: No such file or directory no retry data available ╭considering: /non-exist/$local_part + ├───────text: /non-exist/ + ├considering: $local_part ├──expanding: /non-exist/$local_part ╰─────result: /non-exist/usery ╰──(tainted) @@ -613,6 +873,8 @@ LOG: MAIN failed to open DB file TESTSUITE/spool/db/retry: No such file or directory no retry data available ╭considering: /$local_part + ├───────text: / + ├considering: $local_part ├──expanding: /$local_part ╰─────result: /userz ╰──(tainted) diff --git a/test/stderr/0544 b/test/stderr/0544 index c79ebacb6..40751acc5 100644 --- a/test/stderr/0544 +++ b/test/stderr/0544 @@ -12,6 +12,14 @@ admin user ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -21,6 +29,29 @@ admin user ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -40,16 +71,49 @@ admin user ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: false ╭───scanning: (helo=$sender_helo_name) @@ -58,14 +122,61 @@ admin user ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├───scanning: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├───scanning: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ├─────result: (helo=) ╰───skipping: result is not used + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -73,21 +184,122 @@ admin user ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: false ╭───scanning: for $received_for}} + ├───────text: + for + ├───scanning: $received_for}} + ├───scanning: }} ├──expanding: for $received_for ├─────result: @@ -125,30 +337,43 @@ LOG: MAIN == userx@domain2.ex R=smarthost T=smtp defer (-1): first-pass only routing due to -odqs, queue_smtp_domains or control=queue ╭considering: ${if or {{ !eq{$h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} ╭considering: $h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├considering: $h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├considering: $h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├considering: }{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} ├──expanding: $h_list-id:$h_list-post:$h_list-subscribe: ╰─────result: ╭considering: } }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} ├──expanding: ╰─────result: ╭considering: $h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├considering: }{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} ├──expanding: $h_precedence: ╰─────result: ╭considering: (?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├───────text: (?i)bulk|list|junk + ├considering: } }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} ├──expanding: (?i)bulk|list|junk ╰─────result: (?i)bulk|list|junk ╭considering: $h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} + ├considering: }{(?i)auto-generated|auto-replied} }} {no}{yes}} ├──expanding: $h_auto-submitted: ╰─────result: ╭considering: (?i)auto-generated|auto-replied} }} {no}{yes}} + ├───────text: (?i)auto-generated|auto-replied + ├considering: } }} {no}{yes}} ├──expanding: (?i)auto-generated|auto-replied ╰─────result: (?i)auto-generated|auto-replied ├──condition: or {{ !eq{$h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} ├─────result: false ╭───scanning: no}{yes}} + ├───────text: no + ├───scanning: }{yes}} ├──expanding: no ├─────result: no ╰───skipping: result is not used ╭considering: yes}} + ├───────text: yes + ├considering: }} ├──expanding: yes ╰─────result: yes ├──expanding: ${if or {{ !eq{$h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}} @@ -162,14 +387,23 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: the.local.host.name ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 ╭considering: ${if match_domain {$sender_helo_name}{+dlist}} ╭considering: $sender_helo_name}{+dlist}} + ├considering: }{+dlist}} ├──expanding: $sender_helo_name ╰─────result: ehlo.domain ╰──(tainted) ╭considering: +dlist}} + ├───────text: +dlist + ├considering: }} ├──expanding: +dlist ╰─────result: +dlist ╭considering: $domain @@ -181,14 +415,29 @@ LOG: smtp_connection MAIN ├──expanding: ${if match_domain {$sender_helo_name}{+dlist}} ╰─────result: true ╭considering: domain=$domain/sender_domain=$sender_address_domain + ├───────text: domain= + ├considering: $domain/sender_domain=$sender_address_domain + ├considering: /sender_domain=$sender_address_domain + ├───────text: /sender_domain= + ├considering: $sender_address_domain ├──expanding: domain=$domain/sender_domain=$sender_address_domain ╰─────result: domain=/sender_domain=sender.domain ╰──(tainted) ╭considering: domain=$domain/sender_domain=$sender_address_domain + ├───────text: domain= + ├considering: $domain/sender_domain=$sender_address_domain + ├considering: /sender_domain=$sender_address_domain + ├───────text: /sender_domain= + ├considering: $sender_address_domain ├──expanding: domain=$domain/sender_domain=$sender_address_domain ╰─────result: domain=recipient.domain/sender_domain=sender.domain ╰──(tainted) ╭considering: domain=$domain/sender_domain=$sender_address_domain + ├───────text: domain= + ├considering: $domain/sender_domain=$sender_address_domain + ├considering: /sender_domain=$sender_address_domain + ├───────text: /sender_domain= + ├considering: $sender_address_domain ├──expanding: domain=$domain/sender_domain=$sender_address_domain ╰─────result: domain=recipient.domain/sender_domain=sender.domain ╰──(tainted) diff --git a/test/stderr/0620 b/test/stderr/0620 index 455a3ee1b..89f0e616a 100644 --- a/test/stderr/0620 +++ b/test/stderr/0620 @@ -5,9 +5,17 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: primaryhostname.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 ╭considering: domain $domain + ├───────text: domain + ├considering: $domain ├──expanding: domain $domain ╰─────result: domain trythiskey.ex ╰──(tainted) @@ -15,11 +23,26 @@ LOG: MAIN domain trythiskey.ex created log directory TESTSUITE/spool/log ╭considering: value $domain_data + ├───────text: value + ├considering: $domain_data ├──expanding: value $domain_data ╰─────result: value has this data LOG: MAIN value has this data ╭considering: \$0 '$0' \$1 '$1' + ├backslashed: '\$' + ├considering: 0 '$0' \$1 '$1' + ├───────text: 0 ' + ├considering: $0' \$1 '$1' + ├considering: ' \$1 '$1' + ├───────text: ' + ├considering: \$1 '$1' + ├backslashed: '\$' + ├considering: 1 '$1' + ├───────text: 1 ' + ├considering: $1' + ├considering: ' + ├───────text: ' ├──expanding: \$0 '$0' \$1 '$1' ╰─────result: $0 'trythiskey.ex' $1 '' ╰──(tainted) @@ -35,20 +58,43 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: primaryhostname.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 ╭considering: domain $domain + ├───────text: domain + ├considering: $domain ├──expanding: domain $domain ╰─────result: domain trythiskey.ex ╰──(tainted) LOG: MAIN domain trythiskey.ex ╭considering: value $domain_data + ├───────text: value + ├considering: $domain_data ├──expanding: value $domain_data ╰─────result: value trythiskey.ex LOG: MAIN value trythiskey.ex ╭considering: \$0 '$0' \$1 '$1' + ├backslashed: '\$' + ├considering: 0 '$0' \$1 '$1' + ├───────text: 0 ' + ├considering: $0' \$1 '$1' + ├considering: ' \$1 '$1' + ├───────text: ' + ├considering: \$1 '$1' + ├backslashed: '\$' + ├considering: 1 '$1' + ├───────text: 1 ' + ├considering: $1' + ├considering: ' + ├───────text: ' ├──expanding: \$0 '$0' \$1 '$1' ╰─────result: $0 'trythiskey.ex' $1 '' ╰──(tainted) diff --git a/test/stderr/3000 b/test/stderr/3000 index 0996e349f..86c8b4261 100644 --- a/test/stderr/3000 +++ b/test/stderr/3000 @@ -6,9 +6,13 @@ admin user dropping to exim gid; retaining priv uid ╭considering: ${perl{foo}{arg1}} ╭considering: foo}{arg1}} + ├───────text: foo + ├considering: }{arg1}} ├──expanding: foo ╰─────result: foo ╭considering: arg1}} + ├───────text: arg1 + ├considering: }} ├──expanding: arg1 ╰─────result: arg1 Starting Perl interpreter @@ -16,6 +20,8 @@ Starting Perl interpreter ╰─────result: Subroutine foo called with args: arg1 ╭considering: ${perl{foo_undef}} ╭considering: foo_undef}} + ├───────text: foo_undef + ├considering: }} ├──expanding: foo_undef ╰─────result: foo_undef ├failed to expand: ${perl{foo_undef}} @@ -23,9 +29,15 @@ Starting Perl interpreter ╰failure was forced ╭considering: ${perl{debug_write}{debug from Perl\n}} ╭considering: debug_write}{debug from Perl\n}} + ├───────text: debug_write + ├considering: }{debug from Perl\n}} ├──expanding: debug_write ╰─────result: debug_write ╭considering: debug from Perl\n}} + ├───────text: debug from Perl + ├considering: \n}} + ├backslashed: '\n' + ├considering: }} ├──expanding: debug from Perl\n ╰─────result: debug from Perl @@ -34,9 +46,13 @@ debug from Perl ╰─────result: Wrote debug ╭considering: ${perl{log_write}{log from Perl}} ╭considering: log_write}{log from Perl}} + ├───────text: log_write + ├considering: }{log from Perl}} ├──expanding: log_write ╰─────result: log_write ╭considering: log from Perl}} + ├───────text: log from Perl + ├considering: }} ├──expanding: log from Perl ╰─────result: log from Perl LOG: MAIN diff --git a/test/stderr/5410 b/test/stderr/5410 index 617f1166a..990fac898 100644 --- a/test/stderr/5410 +++ b/test/stderr/5410 @@ -6,6 +6,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -14,18 +20,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -68,19 +82,26 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: userx ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: false ╭───scanning: *}{:}} + ├───────text: * + ├───scanning: }{:}} ├──expanding: * ├─────result: * ╰───skipping: result is not used ╭considering: :}} + ├───────text: : + ├considering: }} ├──expanding: : ╰─────result: : ├──expanding: ${if eq {$address_data}{usery}{*}{:}} @@ -88,19 +109,26 @@ cmd buf flush ddd bytes 127.0.0.1 in hosts_avoid_tls? no (end of list) ╭considering: ${if eq {$address_data}{userz}{*}{:}} ╭considering: $address_data}{userz}{*}{:}} + ├considering: }{userz}{*}{:}} ├──expanding: $address_data ╰─────result: userx ╰──(tainted) ╭considering: userz}{*}{:}} + ├───────text: userz + ├considering: }{*}{:}} ├──expanding: userz ╰─────result: userz ├──condition: eq {$address_data}{userz} ├─────result: false ╭───scanning: *}{:}} + ├───────text: * + ├───scanning: }{:}} ├──expanding: * ├─────result: * ╰───skipping: result is not used ╭considering: :}} + ├───────text: : + ├considering: }} ├──expanding: : ╰─────result: : ├──expanding: ${if eq {$address_data}{userz}{*}{:}} @@ -146,6 +174,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -155,6 +191,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -174,16 +233,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -192,16 +284,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -209,21 +348,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: @@ -270,6 +510,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -278,18 +524,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -332,18 +586,25 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: usery ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: true ╭considering: *}{:}} + ├───────text: * + ├considering: }{:}} ├──expanding: * ╰─────result: * ╭───scanning: :}} + ├───────text: : + ├───scanning: }} ├──expanding: : ├─────result: : ╰───skipping: result is not used @@ -378,6 +639,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -387,6 +656,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -406,16 +698,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -424,16 +749,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -441,21 +813,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: @@ -502,6 +975,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -510,18 +989,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -564,18 +1051,25 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: usery ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: true ╭considering: *}{:}} + ├───────text: * + ├considering: }{:}} ├──expanding: * ╰─────result: * ╭───scanning: :}} + ├───────text: : + ├───scanning: }} ├──expanding: : ├─────result: : ╰───skipping: result is not used @@ -610,6 +1104,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -619,6 +1121,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -638,16 +1163,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -656,16 +1214,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -673,21 +1278,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: diff --git a/test/stderr/5420 b/test/stderr/5420 index fb5bb6fa8..7ac360377 100644 --- a/test/stderr/5420 +++ b/test/stderr/5420 @@ -6,6 +6,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -14,18 +20,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -68,19 +82,26 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: userx ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: false ╭───scanning: *}{:}} + ├───────text: * + ├───scanning: }{:}} ├──expanding: * ├─────result: * ╰───skipping: result is not used ╭considering: :}} + ├───────text: : + ├considering: }} ├──expanding: : ╰─────result: : ├──expanding: ${if eq {$address_data}{usery}{*}{:}} @@ -88,19 +109,26 @@ cmd buf flush ddd bytes 127.0.0.1 in hosts_avoid_tls? no (end of list) ╭considering: ${if eq {$address_data}{userz}{*}{:}} ╭considering: $address_data}{userz}{*}{:}} + ├considering: }{userz}{*}{:}} ├──expanding: $address_data ╰─────result: userx ╰──(tainted) ╭considering: userz}{*}{:}} + ├───────text: userz + ├considering: }{*}{:}} ├──expanding: userz ╰─────result: userz ├──condition: eq {$address_data}{userz} ├─────result: false ╭───scanning: *}{:}} + ├───────text: * + ├───scanning: }{:}} ├──expanding: * ├─────result: * ╰───skipping: result is not used ╭considering: :}} + ├───────text: : + ├considering: }} ├──expanding: : ╰─────result: : ├──expanding: ${if eq {$address_data}{userz}{*}{:}} @@ -147,6 +175,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -156,6 +192,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -175,16 +234,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -193,16 +285,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -210,21 +349,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: @@ -271,6 +511,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -279,18 +525,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -333,18 +587,25 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: usery ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: true ╭considering: *}{:}} + ├───────text: * + ├considering: }{:}} ├──expanding: * ╰─────result: * ╭───scanning: :}} + ├───────text: : + ├───scanning: }} ├──expanding: : ├─────result: : ╰───skipping: result is not used @@ -379,6 +640,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -388,6 +657,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -407,16 +699,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -425,16 +750,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -442,21 +814,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: @@ -503,6 +976,12 @@ admin user LOG: smtp_connection MAIN SMTP connection from CALLER ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full + ├considering: ESMTP Exim $version_number $tod_full + ├───────text: ESMTP Exim + ├considering: $version_number $tod_full + ├considering: $tod_full + ├───────text: + ├considering: $tod_full ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 in dsn_advertise_hosts? no (option unset) @@ -511,18 +990,26 @@ LOG: smtp_connection MAIN in tls_advertise_hosts? yes (matched "*") ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}} ╭considering: SERVER}{server}{queue}{cutthrough}} + ├───────text: SERVER + ├considering: }{server}{queue}{cutthrough}} ├──expanding: SERVER ╰─────result: SERVER ╭considering: server}{queue}{cutthrough}} + ├───────text: server + ├considering: }{queue}{cutthrough}} ├──expanding: server ╰─────result: server ├──condition: eq {SERVER}{server} ├─────result: false ╭───scanning: queue}{cutthrough}} + ├───────text: queue + ├───scanning: }{cutthrough}} ├──expanding: queue ├─────result: queue ╰───skipping: result is not used ╭considering: cutthrough}} + ├───────text: cutthrough + ├considering: }} ├──expanding: cutthrough ╰─────result: cutthrough ├──expanding: ${if eq {SERVER}{server}{queue}{cutthrough}} @@ -565,18 +1052,25 @@ cmd buf flush ddd bytes 250 HELP ╭considering: ${if eq {$address_data}{usery}{*}{:}} ╭considering: $address_data}{usery}{*}{:}} + ├considering: }{usery}{*}{:}} ├──expanding: $address_data ╰─────result: usery ╰──(tainted) ╭considering: usery}{*}{:}} + ├───────text: usery + ├considering: }{*}{:}} ├──expanding: usery ╰─────result: usery ├──condition: eq {$address_data}{usery} ├─────result: true ╭considering: *}{:}} + ├───────text: * + ├considering: }{:}} ├──expanding: * ╰─────result: * ╭───scanning: :}} + ├───────text: : + ├───scanning: }} ├──expanding: : ├─────result: : ╰───skipping: result is not used @@ -611,6 +1105,14 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: Received: + ├considering: ${if def:sender_rcvhost {from $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_rcvhost ├─────result: false ╭───scanning: from $sender_rcvhost @@ -620,6 +1122,29 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├───scanning: $sender_rcvhost + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from $sender_rcvhost ├─────result: from @@ -639,16 +1164,49 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: from + ├considering: ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ╎╭considering: $sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std ╎ }}(Exim $version_number) ╎ ${if def:sender_address {(envelope-from <$sender_address>) ╎ }}id $message_exim_id${if def:received_for { ╎ for $received_for}} + ╎├considering: } }}${if def:sender_helo_name {(helo=$sender_helo_name) + ╎ }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + ╎ }}(Exim $version_number) + ╎ ${if def:sender_address {(envelope-from <$sender_address>) + ╎ }}id $message_exim_id${if def:received_for { + ╎ for $received_for}} ╎├──expanding: $sender_ident ╎╰─────result: CALLER + ├─────op-res: CALLER + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: from ${quote_local_part:$sender_ident} ╰─────result: from CALLER + ├considering: ${if def:sender_helo_name {(helo=$sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_helo_name ├─────result: true ╭considering: (helo=$sender_helo_name) @@ -657,16 +1215,63 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (helo= + ├considering: $sender_helo_name) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (helo=$sender_helo_name) ╰─────result: (helo=myhost.test.ex) ╰──(tainted) + ├considering: }}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: ${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name) }} ╰─────result: from CALLER (helo=myhost.test.ex) ╰──(tainted) + ├considering: by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: by + ├considering: $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:received_protocol ├─────result: true ╭considering: with $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std @@ -674,21 +1279,122 @@ end of inline ACL: ACCEPT ${if def:sender_address {(envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: with + ├considering: $received_protocol }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + ├considering: }}${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: with $received_protocol ╰─────result: with local-esmtp + ├considering: ${if def:tls_in_ver { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: ($tls_in_ver) + ├─────result: () + ╰───skipping: result is not used + ├considering: ${if def:tls_in_cipher_std { tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──condition: def:tls_in_cipher_std + ├─────result: false + ╭───scanning: tls $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: tls + ├───scanning: $tls_in_cipher_std + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───scanning: + }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: + + ├───scanning: }}(Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├──expanding: tls $tls_in_cipher_std + + ├─────result: tls + + ╰───skipping: result is not used + ├considering: (Exim $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: (Exim + ├considering: $version_number) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ) + ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: ) + + ├considering: ${if def:sender_address {(envelope-from <$sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} ├──condition: def:sender_address ├─────result: true ╭considering: (envelope-from <$sender_address>) }}id $message_exim_id${if def:received_for { for $received_for}} + ├───────text: (envelope-from < + ├considering: $sender_address>) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├considering: >) + }}id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: >) + + ├considering: }}id $message_exim_id${if def:received_for { + for $received_for}} ├──expanding: (envelope-from <$sender_address>) ╰─────result: (envelope-from ) + ├considering: id $message_exim_id${if def:received_for { + for $received_for}} + ├───────text: id + ├considering: $message_exim_id${if def:received_for { + for $received_for}} + ├considering: ${if def:received_for { + for $received_for}} ├──condition: def:received_for ├─────result: true ╭considering: for $received_for}} + ├───────text: + for + ├considering: $received_for}} + ├considering: }} ├──expanding: for $received_for ╰─────result: