git-send-email: remove invalid addresses earlier

Some addresses are passed twice to unique_email_list() and invalid addresses may be reported twice per send_message. Now we warn about them earlier and we also remove invalid addresses. This also removes using of undefined values for string comparison for invalid addresses in cc list processing. Signed-off-by: Krzysztof Mazur <krzysiek@podlesie.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Krzysztof Mazur committed Nov 22, 2012 at 19:12 UTC e43122556912b02ec00746c4b528d7408da9a70f
1 file changed +39 -13
git-send-email.perl
+39 -13
@@ -786,9 +786,11 @@ sub expand_one_alias {
786 }
787
788 @initial_to = expand_aliases(@initial_to);
789 -@initial_to = (map { sanitize_address($_) } @initial_to);
789 +@initial_to = validate_address_list(sanitize_address_list(@initial_to));
790 @initial_cc = expand_aliases(@initial_cc);
791 +@initial_cc = validate_address_list(sanitize_address_list(@initial_cc));
792 @bcclist = expand_aliases(@bcclist);
793 +@bcclist = validate_address_list(sanitize_address_list(@bcclist));
794
795 if ($thread && !defined $initial_reply_to && $prompting) {
796 $initial_reply_to = ask(
@@ -839,6 +841,28 @@ sub extract_valid_address {
841 return undef;
842 }
843
844 +sub extract_valid_address_or_die {
845 + my $address = shift;
846 + $address = extract_valid_address($address);
847 + die "error: unable to extract a valid address from: $address\n"
848 + if !$address;
849 + return $address;
850 +}
851 +
852 +sub validate_address {
853 + my $address = shift;
854 + if (!extract_valid_address($address)) {
855 + print STDERR "W: unable to extract a valid address from: $address\n";
856 + return undef;
857 + }
858 + return $address;
859 +}
860 +
861 +sub validate_address_list {
862 + return (grep { defined $_ }
863 + map { validate_address($_) } @_);
864 +}
865 +
866 # Usually don't need to change anything below here.
867
868 # we make a "fake" message id by taking the current number
@@ -955,6 +979,10 @@ sub sanitize_address {
979
980 }
981
982 +sub sanitize_address_list {
983 + return (map { sanitize_address($_) } @_);
984 +}
985 +
986 # Returns the local Fully Qualified Domain Name (FQDN) if available.
987 #
988 # Tightly configured MTAa require that a caller sends a real DNS
@@ -1017,14 +1045,13 @@ sub maildomain {
1045
1046 sub send_message {
1047 my @recipients = unique_email_list(@to);
1020 - @cc = (grep { my $cc = extract_valid_address($_);
1048 + @cc = (grep { my $cc = extract_valid_address_or_die($_);
1049 not grep { $cc eq $_ || $_ =~ /<\Q${cc}\E>$/ } @recipients
1050 }
1023 - map { sanitize_address($_) }
1051 @cc);
1052 my $to = join (",\n\t", @recipients);
1053 @recipients = unique_email_list(@recipients,@cc,@bcclist);
1027 - @recipients = (map { extract_valid_address($_) } @recipients);
1054 + @recipients = (map { extract_valid_address_or_die($_) } @recipients);
1055 my $date = format_2822_time($time++);
1056 my $gitversion = '@@GIT_VERSION@@';
1057 if ($gitversion =~ m/..GIT_VERSION../) {
@@ -1267,7 +1294,7 @@ foreach my $t (@files) {
1294 foreach my $addr (parse_address_line($1)) {
1295 printf("(mbox) Adding to: %s from line '%s'\n",
1296 $addr, $_) unless $quiet;
1270 - push @to, sanitize_address($addr);
1297 + push @to, $addr;
1298 }
1299 }
1300 elsif (/^Cc:\s+(.*)$/) {
@@ -1376,6 +1403,9 @@ foreach my $t (@files) {
1403 ($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
1404 $needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);
1405
1406 + @to = validate_address_list(sanitize_address_list(@to));
1407 + @cc = validate_address_list(sanitize_address_list(@cc));
1408 +
1409 @to = (@initial_to, @to);
1410 @cc = (@initial_cc, @cc);
1411
@@ -1431,14 +1461,10 @@ sub unique_email_list {
1461 my @emails;
1462
1463 foreach my $entry (@_) {
1434 - if (my $clean = extract_valid_address($entry)) {
1435 - $seen{$clean} ||= 0;
1436 - next if $seen{$clean}++;
1437 - push @emails, $entry;
1438 - } else {
1439 - print STDERR "W: unable to extract a valid address",
1440 - " from: $entry\n";
1441 - }
1464 + my $clean = extract_valid_address_or_die($entry);
1465 + $seen{$clean} ||= 0;
1466 + next if $seen{$clean}++;
1467 + push @emails, $entry;
1468 }
1469 return @emails;
1470 }