Skip to content

Commit c52f085

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() which is a bundled 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. Make the encoding warning logic specific to the 8bit prompt, also add a unique confirmation prompt which reduces the load on ask(), and improves maintainability. 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 'foobar' does not appear to be a valid charset name. Use it anyway [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 c52f085

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

git-send-email.perl

Lines changed: 22 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

@@ -1044,9 +1045,27 @@ sub file_declares_8bit_cte {
10441045
foreach my $f (sort keys %broken_encoding) {
10451046
print " $f\n";
10461047
}
1047-
$auto_8bit_encoding = ask(__("Which 8bit encoding should I declare [UTF-8]? "),
1048-
valid_re => qr/.{4}/, confirm_only => 1,
1049-
default => "UTF-8");
1048+
while (1) {
1049+
my $encoding = ask(
1050+
__("Declare which 8bit encoding to use [default: UTF-8]? "),
1051+
valid_re => qr/^\S+$/,
1052+
default => "UTF-8");
1053+
next unless defined $encoding;
1054+
if (find_encoding($encoding)) {
1055+
$auto_8bit_encoding = $encoding;
1056+
last;
1057+
}
1058+
my $yesno = ask(
1059+
sprintf(
1060+
__("'%s' does not appear to be a valid charset name. Use it anyway [y/N]? "),
1061+
$encoding),
1062+
valid_re => qr/^(?:y|n)/i,
1063+
default => "n");
1064+
if (defined $yesno && $yesno =~ /^y/i) {
1065+
$auto_8bit_encoding = $encoding;
1066+
last;
1067+
}
1068+
}
10501069
}
10511070
10521071
if (!$force) {

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)