X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/858e91c21a3a14da760299b6d54676ac18526418..0cbf2b821bb13da0268556d0e30ea627d5592c60:/src/src/expand.c diff --git a/src/src/expand.c b/src/src/expand.c index fbbc68154..f09271782 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -111,7 +111,7 @@ static uschar *item_table[] = { US"hash", US"hmac", US"if", -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N US"imapfolder", #endif US"length", @@ -141,7 +141,7 @@ enum { EITEM_HASH, EITEM_HMAC, EITEM_IF, -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N EITEM_IMAPFOLDER, #endif EITEM_LENGTH, @@ -173,7 +173,7 @@ static uschar *op_table_underscore[] = { US"reverse_ip", US"time_eval", US"time_interval" -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N ,US"utf8_domain_from_alabel", US"utf8_domain_to_alabel", US"utf8_localpart_from_alabel", @@ -188,7 +188,7 @@ enum { EOP_REVERSE_IP, EOP_TIME_EVAL, EOP_TIME_INTERVAL -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N ,EOP_UTF8_DOMAIN_FROM_ALABEL, EOP_UTF8_DOMAIN_TO_ALABEL, EOP_UTF8_LOCALPART_FROM_ALABEL, @@ -210,6 +210,8 @@ static uschar *op_table_main[] = { US"hash", US"hex2b64", US"hexquote", + US"ipv6denorm", + US"ipv6norm", US"l", US"lc", US"length", @@ -248,6 +250,8 @@ enum { EOP_HASH, EOP_HEX2B64, EOP_HEXQUOTE, + EOP_IPV6DENORM, + EOP_IPV6NORM, EOP_L, EOP_LC, EOP_LENGTH, @@ -489,6 +493,7 @@ static var_entry var_table[] = { { "dkim_headernames", vtype_dkim, (void *)DKIM_HEADERNAMES }, { "dkim_identity", vtype_dkim, (void *)DKIM_IDENTITY }, { "dkim_key_granularity",vtype_dkim, (void *)DKIM_KEY_GRANULARITY }, + { "dkim_key_length", vtype_int, &dkim_key_length }, { "dkim_key_nosubdomains",vtype_dkim, (void *)DKIM_NOSUBDOMAINS }, { "dkim_key_notes", vtype_dkim, (void *)DKIM_KEY_NOTES }, { "dkim_key_srvtype", vtype_dkim, (void *)DKIM_KEY_SRVTYPE }, @@ -511,7 +516,7 @@ static var_entry var_table[] = { { "dnslist_value", vtype_stringptr, &dnslist_value }, { "domain", vtype_stringptr, &deliver_domain }, { "domain_data", vtype_stringptr, &deliver_domain_data }, -#ifdef EXPERIMENTAL_EVENT +#ifndef DISABLE_EVENT { "event_data", vtype_stringptr, &event_data }, /*XXX want to use generic vars for as many of these as possible*/ @@ -568,7 +573,7 @@ static var_entry var_table[] = { { "message_id", vtype_stringptr, &message_id }, { "message_linecount", vtype_int, &message_linecount }, { "message_size", vtype_int, &message_size }, -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N { "message_smtputf8", vtype_bool, &message_smtputf8 }, #endif #ifdef WITH_CONTENT_SCAN @@ -610,12 +615,12 @@ static var_entry var_table[] = { { "prdr_requested", vtype_bool, &prdr_requested }, #endif { "primary_hostname", vtype_stringptr, &primary_hostname }, -#ifdef EXPERIMENTAL_PROXY - { "proxy_host_address", vtype_stringptr, &proxy_host_address }, - { "proxy_host_port", vtype_int, &proxy_host_port }, +#if defined(SUPPORT_PROXY) || defined(SUPPORT_SOCKS) + { "proxy_external_address",vtype_stringptr, &proxy_external_address }, + { "proxy_external_port", vtype_int, &proxy_external_port }, + { "proxy_local_address", vtype_stringptr, &proxy_local_address }, + { "proxy_local_port", vtype_int, &proxy_local_port }, { "proxy_session", vtype_bool, &proxy_session }, - { "proxy_target_address",vtype_stringptr, &proxy_target_address }, - { "proxy_target_port", vtype_int, &proxy_target_port }, #endif { "prvscheck_address", vtype_stringptr, &prvscheck_address }, { "prvscheck_keynum", vtype_stringptr, &prvscheck_keynum }, @@ -4090,7 +4095,7 @@ while (*s != 0) continue; } -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N case EITEM_IMAPFOLDER: { /* ${imapfolder {name}{sep]{specials}} */ uschar *sub_arg[3]; @@ -6406,6 +6411,39 @@ while (*s != 0) continue; } + case EOP_IPV6NORM: + case EOP_IPV6DENORM: + { + int type = string_is_ip_address(sub, NULL); + int binary[4]; + uschar buffer[44]; + + switch (type) + { + case 6: + (void) host_aton(sub, binary); + break; + + case 4: /* convert to IPv4-mapped IPv6 */ + binary[0] = binary[1] = 0; + binary[2] = 0x0000ffff; + (void) host_aton(sub, binary+3); + break; + + case 0: + expand_string_message = + string_sprintf("\"%s\" is not an IP address", sub); + goto EXPAND_FAILED; + } + + yield = string_cat(yield, &size, &ptr, buffer, + c == EOP_IPV6NORM + ? ipv6_nmtoa(binary, buffer) + : host_nmtoa(4, binary, -1, buffer, ':') + ); + continue; + } + case EOP_ADDRESS: case EOP_LOCAL_PART: case EOP_DOMAIN: @@ -6719,7 +6757,7 @@ while (*s != 0) continue; } -#ifdef EXPERIMENTAL_INTERNATIONAL +#ifdef SUPPORT_I18N case EOP_UTF8_DOMAIN_TO_ALABEL: { uschar * error = NULL;