From 5adcf2c69989884ad6c51df0f9ad5e68f6a3f650 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Thu, 30 May 2013 10:11:13 +0300 Subject: [PATCH 1/7] t/send-email.sh: add test for suppress-cc=self This adds a basic test for --suppress-cc=self option of git send-email. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t9001-send-email.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index ebd5c5db45c..f4745ce7422 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -171,6 +171,49 @@ Result: OK EOF " +test_suppress_self () { + test_commit $3 && + test_when_finished "git reset --hard HEAD^" && + + write_script cccmd-sed <<-EOF && + sed -n -e s/^cccmd--//p "\$1" + EOF + + git commit --amend --author="$1 <$2>" -F - && + clean_fake_sendmail && + git format-patch --stdout -1 >"suppress-self-$3.patch" && + + git send-email --from="$1 <$2>" \ + --to=nobody@example.com \ + --cc-cmd=./cccmd-sed \ + --suppress-cc=self \ + --smtp-server="$(pwd)/fake.sendmail" \ + suppress-self-$3.patch && + + mv msgtxt1 msgtxt1-$3 && + sed -e '/^$/q' msgtxt1-$3 >"msghdr1-$3" && + >"expected-no-cc-$3" && + + (grep '^Cc:' msghdr1-$3 >"actual-no-cc-$3"; + test_cmp expected-no-cc-$3 actual-no-cc-$3) +} + +test_suppress_self_unquoted () { + test_suppress_self "$1" "$2" "unquoted-$3" <<-EOF + test suppress-cc.self unquoted-$3 with name $1 email $2 + + unquoted-$3 + + Cc: $1 <$2> + Signed-off-by: $1 <$2> + EOF +} + +test_expect_success $PREREQ 'self name is suppressed' " + test_suppress_self_unquoted 'A U Thor' 'author@redhat.com' \ + 'self_name_suppressed' +" + test_expect_success $PREREQ 'Show all headers' ' git send-email \ --dry-run \ From 5e3ee39df2be5712dbff5a7cbca94d35ea56990c Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:10:55 +0300 Subject: [PATCH 2/7] send-email: fix suppress-cc=self on cccmd When cccmd is used, old-style suppress-from filter is applied by the newer suppress-cc=self isn't. Fix this up. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- git-send-email.perl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-send-email.perl b/git-send-email.perl index 70cad15ec46..d8344368b61 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1446,7 +1446,7 @@ sub recipients_cmd { $address =~ s/^\s*//g; $address =~ s/\s*$//g; $address = sanitize_address($address); - next if ($address eq $sanitized_sender and $suppress_from); + next if ($address eq $sanitized_sender and $suppress_cc{'self'}); push @addresses, $address; printf("($prefix) Adding %s: %s from: '%s'\n", $what, $address, $cmd) unless $quiet; From d6ee44568c876f7644f23d7f4319f7689348de76 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:10:57 +0300 Subject: [PATCH 3/7] t/send-email: test suppress-cc=self on cccmd Check that suppress-cc=self works when applied to output of cccmd. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t9001-send-email.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index f4745ce7422..d7797c5e3f0 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -204,13 +204,15 @@ test_suppress_self_unquoted () { unquoted-$3 + cccmd--$1 <$2> + Cc: $1 <$2> Signed-off-by: $1 <$2> EOF } test_expect_success $PREREQ 'self name is suppressed' " - test_suppress_self_unquoted 'A U Thor' 'author@redhat.com' \ + test_suppress_self_unquoted 'A U Thor' 'author@example.com' \ 'self_name_suppressed' " From da18759e86bb1a7ee718c79a0c6cb15fbcbdf3c2 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:11:00 +0300 Subject: [PATCH 4/7] send-email: make --suppress-cc=self sanitize input --suppress-cc=self fails to filter sender address in many cases where it needs to be sanitized in some way, for example quoted: "A U. Thor" To fix, make send-email sanitize both sender and the address it is compared against. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- git-send-email.perl | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index d8344368b61..7d886958ae0 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -759,6 +759,11 @@ if (!defined $sender) { $sender = $repoauthor || $repocommitter || ''; } +# $sender could be an already sanitized address +# (e.g. sendemail.from could be manually sanitized by user). +# But it's a no-op to run sanitize_address on an already sanitized address. +$sender = sanitize_address($sender); + my $prompting = 0; if (!@initial_to && !defined $to_cmd) { my $to = ask("Who should the emails be sent to (if any)? ", @@ -1071,10 +1076,9 @@ sub send_message { if ($cc ne '') { $ccline = "\nCc: $cc"; } - my $sanitized_sender = sanitize_address($sender); make_message_id() unless defined($message_id); - my $header = "From: $sanitized_sender + my $header = "From: $sender To: $to${ccline} Subject: $subject Date: $date @@ -1091,7 +1095,7 @@ X-Mailer: git-send-email $gitversion } my @sendmail_parameters = ('-i', @recipients); - my $raw_from = $sanitized_sender; + my $raw_from = $sender; if (defined $envelope_sender && $envelope_sender ne "auto") { $raw_from = $envelope_sender; } @@ -1292,8 +1296,9 @@ foreach my $t (@files) { } elsif (/^From:\s+(.*)$/i) { ($author, $author_encoding) = unquote_rfc2047($1); + my $sauthor = sanitize_address($author); next if $suppress_cc{'author'}; - next if $suppress_cc{'self'} and $author eq $sender; + next if $suppress_cc{'self'} and $sauthor eq $sender; printf("(mbox) Adding cc: %s from line '%s'\n", $1, $_) unless $quiet; push @cc, $1; @@ -1307,7 +1312,9 @@ foreach my $t (@files) { } elsif (/^Cc:\s+(.*)$/i) { foreach my $addr (parse_address_line($1)) { - if (unquote_rfc2047($addr) eq $sender) { + my $qaddr = unquote_rfc2047($addr); + my $saddr = sanitize_address($qaddr); + if ($saddr eq $sender) { next if ($suppress_cc{'self'}); } else { next if ($suppress_cc{'cc'}); @@ -1354,7 +1361,8 @@ foreach my $t (@files) { chomp; my ($what, $c) = ($1, $2); chomp $c; - if ($c eq $sender) { + my $sc = sanitize_address($c); + if ($sc eq $sender) { next if ($suppress_cc{'self'}); } else { next if $suppress_cc{'sob'} and $what =~ /Signed-off-by/i; @@ -1438,7 +1446,6 @@ foreach my $t (@files) { sub recipients_cmd { my ($prefix, $what, $cmd, $file) = @_; - my $sanitized_sender = sanitize_address($sender); my @addresses = (); open my $fh, "-|", "$cmd \Q$file\E" or die "($prefix) Could not execute '$cmd'"; @@ -1446,7 +1453,7 @@ sub recipients_cmd { $address =~ s/^\s*//g; $address =~ s/\s*$//g; $address = sanitize_address($address); - next if ($address eq $sanitized_sender and $suppress_cc{'self'}); + next if ($address eq $sender and $suppress_cc{'self'}); push @addresses, $address; printf("($prefix) Adding %s: %s from: '%s'\n", $what, $address, $cmd) unless $quiet; From dd29f0b4dcc4e5411adeb310d6cd14a5a626b22c Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:11:02 +0300 Subject: [PATCH 5/7] t/send-email: add test with quoted sender add test where sender address needs to be quoted. Make sure --suppress-cc=self works well in this case. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t9001-send-email.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index d7797c5e3f0..39d82f46e47 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -211,11 +211,31 @@ test_suppress_self_unquoted () { EOF } +test_suppress_self_quoted () { + test_suppress_self "$1" "$2" "quoted-$3" <<-EOF + test suppress-cc.self quoted-$3 with name $1 email $2 + + quoted-$3 + + cccmd--"$1" <$2> + + Cc: $1 <$2> + Cc: "$1" <$2> + Signed-off-by: $1 <$2> + Signed-off-by: "$1" <$2> + EOF +} + test_expect_success $PREREQ 'self name is suppressed' " test_suppress_self_unquoted 'A U Thor' 'author@example.com' \ 'self_name_suppressed' " +test_expect_success $PREREQ 'self name with dot is suppressed' " + test_suppress_self_quoted 'A U. Thor' 'author@example.com' \ + 'self_name_dot_suppressed' +" + test_expect_success $PREREQ 'Show all headers' ' git send-email \ --dry-run \ From 4b45bcf7b141baf49c7290925b4fa5a40e47b610 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:11:04 +0300 Subject: [PATCH 6/7] t/send-email: test suppress-cc=self with non-ascii test suppress-cc=self when sender is non-acsii Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t9001-send-email.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 39d82f46e47..e4b3514d732 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -236,6 +236,11 @@ test_expect_success $PREREQ 'self name with dot is suppressed' " 'self_name_dot_suppressed' " +test_expect_success $PREREQ 'non-ascii self name is suppressed' " + test_suppress_self_quoted 'Füñný Nâmé' 'odd_?=mail@example.com' \ + 'non_ascii_self_suppressed' +" + test_expect_success $PREREQ 'Show all headers' ' git send-email \ --dry-run \ From 14952666d18e5256e1796633e5a927891e77a8de Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 5 Jun 2013 21:11:08 +0300 Subject: [PATCH 7/7] test-send-email: test for pre-sanitized self name Users can sanitize from address manually. Verify that these are suppressed properly. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t9001-send-email.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index e4b3514d732..ebcb60a050c 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -241,6 +241,11 @@ test_expect_success $PREREQ 'non-ascii self name is suppressed' " 'non_ascii_self_suppressed' " +test_expect_success $PREREQ 'sanitized self name is suppressed' " + test_suppress_self_unquoted '\"A U. Thor\"' 'author@example.com' \ + 'self_name_sanitized_suppressed' +" + test_expect_success $PREREQ 'Show all headers' ' git send-email \ --dry-run \