From: Stoiko Ivanov Date: Wed, 18 Mar 2020 10:23:42 +0000 (+0100) Subject: fix rendering of ipv(4|6) literal lmtp transports X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=0280ecd45e07dad0817ced8c8dc7b6beba6c198a;p=pmg-api.git fix rendering of ipv(4|6) literal lmtp transports While reviewing support for lmtp as transport one thing I forgot to test was adding a lmtp-transport pointing to an IPv6 address. Using the use_mx flag (which only makes sense for domain-names) to provide the information of whether the next-hop/hostname should be written out in square brackets or not is a bit confusing, and leads to ambiguous results when providing ipv6 literal addresses: > host: 2001:db8:25::25 > port: 24 > gets rendered as > lmtp:inet:2001:db8:25::25:24 Which postfix oddly enough parses 'correctly'; postfix splits on ':' and uses the last part as port. For ip4 literals and dns-names this works for ip6 literals it only works if you provide a port so it makes more sense to always write ip(4|6) literals in brackets By introducing a explicit flag "$bracket_host" and reordering the conditions lmtp and smtp entries get rendered correctly (see `man smtp`). Additionally fixes an indentation glitch in read_transport_map. Signed-off-by: Stoiko Ivanov Reviewed-By: Dominik Csapak --- diff --git a/src/PMG/Config.pm b/src/PMG/Config.pm index 5b5f03f..3c83944 100755 --- a/src/PMG/Config.pm +++ b/src/PMG/Config.pm @@ -1138,7 +1138,7 @@ sub read_transport_map { $host = $1; $use_mx = 0; } - $use_mx = 0 if ($protocol eq "lmtp"); + $use_mx = 0 if ($protocol eq "lmtp"); eval { PVE::JSONSchema::pve_verify_address($host); }; if (my $err = $@) { @@ -1177,19 +1177,21 @@ sub write_transport_map { if defined($comment) && $comment !~ m/^\s*$/; my $use_mx = $data->{use_mx}; - $use_mx = 0 if $data->{host} =~ m/^(?:$IPV4RE|$IPV6RE)$/; + my $bracket_host = ! $use_mx; if ($data->{protocol} eq 'lmtp') { - $use_mx = 1; + $bracket_host = 0; $data->{protocol} .= ":inet"; } - if ($use_mx) { + $bracket_host = 1 if $data->{host} =~ m/^(?:$IPV4RE|$IPV6RE)$/i; + + if ($bracket_host) { PVE::Tools::safe_print( - $filename, $fh, "$data->{domain} $data->{protocol}:$data->{host}:$data->{port}\n"); + $filename, $fh, "$data->{domain} $data->{protocol}:[$data->{host}]:$data->{port}\n"); } else { PVE::Tools::safe_print( - $filename, $fh, "$data->{domain} $data->{protocol}:[$data->{host}]:$data->{port}\n"); + $filename, $fh, "$data->{domain} $data->{protocol}:$data->{host}:$data->{port}\n"); } } }