diff options
Diffstat (limited to 'git-send-email.perl')
| -rwxr-xr-x | git-send-email.perl | 36 | 
1 files changed, 25 insertions, 11 deletions
| diff --git a/git-send-email.perl b/git-send-email.perl index 82c6feaa46..58c8bc2a59 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -146,6 +146,11 @@ my $have_mail_address = eval { require Mail::Address; 1 };  my $smtp;  my $auth; +# Regexes for RFC 2047 productions. +my $re_token = qr/[^][()<>@,;:\\"\/?.= \000-\037\177-\377]+/; +my $re_encoded_text = qr/[^? \000-\037\177-\377]+/; +my $re_encoded_word = qr/=\?($re_token)\?($re_token)\?($re_encoded_text)\?=/; +  # Variables we fill in automatically, or via prompting:  my (@to,$no_to,@initial_to,@cc,$no_cc,@initial_cc,@bcclist,$no_bcc,@xh,  	$initial_reply_to,$initial_subject,@files, @@ -917,15 +922,26 @@ $time = time - scalar $#files;  sub unquote_rfc2047 {  	local ($_) = @_; -	my $encoding; -	s{=\?([^?]+)\?q\?(.*?)\?=}{ -		$encoding = $1; -		my $e = $2; -		$e =~ s/_/ /g; -		$e =~ s/=([0-9A-F]{2})/chr(hex($1))/eg; -		$e; +	my $charset; +	my $sep = qr/[ \t]+/; +	s{$re_encoded_word(?:$sep$re_encoded_word)*}{ +		my @words = split $sep, $&; +		foreach (@words) { +			m/$re_encoded_word/; +			$charset = $1; +			my $encoding = $2; +			my $text = $3; +			if ($encoding eq 'q' || $encoding eq 'Q') { +				$_ = $text; +				s/_/ /g; +				s/=([0-9A-F]{2})/chr(hex($1))/egi; +			} else { +				# other encodings not supported yet +			} +		} +		join '', @words;  	}eg; -	return wantarray ? ($_, $encoding) : $_; +	return wantarray ? ($_, $charset) : $_;  }  sub quote_rfc2047 { @@ -938,10 +954,8 @@ sub quote_rfc2047 {  sub is_rfc2047_quoted {  	my $s = shift; -	my $token = qr/[^][()<>@,;:"\/?.= \000-\037\177-\377]+/; -	my $encoded_text = qr/[!->@-~]+/;  	length($s) <= 75 && -	$s =~ m/^(?:"[[:ascii:]]*"|=\?$token\?$token\?$encoded_text\?=)$/o; +	$s =~ m/^(?:"[[:ascii:]]*"|$re_encoded_word)$/o;  }  sub subject_needs_rfc2047_quoting { | 
