Skip to content

Commit ba754ef

Browse files
shreyp135gitster
authored andcommitted
send-email: validate charset name in 8bit encoding prompt
When a non-ASCII character is detected in the body or subject of the email the user is prompted with, Which 8bit encoding should I declare [UTF-8]? foo After this the input string is validated by the regex, based on the fact that the charset string will be minimum 4 characters [1]. If the string is more than 4 letters the email is sent, if not then a second prompt to confirm is asked to the user, Are you sure you want to use <foo> [y/N]? y This relies on a length based regex heuristic check to validate the user input, and can allow clearly invalid charset names to pass if the input is greater than 4 characters. Add a semantic validation of the charset name using the Encode::find_encoding() module of perl. If the encoding is not recognized, warn the user and ask for confirmation before proceeding. After this validation the lenght based validation becomes redundant and also breaks flow, so change the regex of valid input to any non blank string. Additionally, the wording of the first prompt can confuse the user if not read properly or under any default assumptions for a yes/no prompt. Change the wording to make it explicitly clear to the user that the prompt needs a string input, UTF-8 being the default. The intended flow is, Declare which 8bit encoding to use [default: UTF-8]? foobar warning: 'foobar' does not appear to be a valid charset name. Are you sure you want to use <foobar> [y/N]? [1]- git@852a15d Signed-off-by: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 7c02d39 commit ba754ef

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

git-send-email.perl

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Git::LoadCPAN::Error qw(:try);
2424
use Git;
2525
use Git::I18N;
26+
use Encode qw(find_encoding);
2627

2728
Getopt::Long::Configure qw/ pass_through /;
2829

@@ -987,6 +988,7 @@ sub get_patch_subject {
987988
sub ask {
988989
my ($prompt, %arg) = @_;
989990
my $valid_re = $arg{valid_re};
991+
my $warn_invalid = $arg{warn_invalid};
990992
my $default = $arg{default};
991993
my $confirm_only = $arg{confirm_only};
992994
my $resp;
@@ -1005,7 +1007,15 @@ sub ask {
10051007
return $default;
10061008
}
10071009
if (!defined $valid_re or $resp =~ /$valid_re/) {
1008-
return $resp;
1010+
if ($warn_invalid) {
1011+
if (find_encoding($resp)) {
1012+
return $resp;
1013+
} else {
1014+
printf STDERR __("warning: '%s' does not appear to be a valid charset name.\n"), $resp;
1015+
}
1016+
} else {
1017+
return $resp;
1018+
}
10091019
}
10101020
if ($confirm_only) {
10111021
my $yesno = $term->readline(
@@ -1044,8 +1054,9 @@ sub file_declares_8bit_cte {
10441054
foreach my $f (sort keys %broken_encoding) {
10451055
print " $f\n";
10461056
}
1047-
$auto_8bit_encoding = ask(__("Which 8bit encoding should I declare [UTF-8]? "),
1048-
valid_re => qr/.{4}/, confirm_only => 1,
1057+
$auto_8bit_encoding = ask(__("Declare which 8bit encoding to use [default: UTF-8]? "),
1058+
valid_re => qr/^\S+$/, confirm_only => 1,
1059+
warn_invalid => 1,
10491060
default => "UTF-8");
10501061
}
10511062

t/t9001-send-email.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1691,7 +1691,7 @@ test_expect_success $PREREQ 'asks about and fixes 8bit encodings' '
16911691
email-using-8bit >stdout &&
16921692
grep "do not declare a Content-Transfer-Encoding" stdout &&
16931693
grep email-using-8bit stdout &&
1694-
grep "Which 8bit encoding" stdout &&
1694+
grep "Declare which 8bit encoding to use" stdout &&
16951695
grep -E "Content|MIME" msgtxt1 >actual &&
16961696
test_cmp content-type-decl actual
16971697
'

0 commit comments

Comments
 (0)