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
}