X-Git-Url: https://git.ladys.computer/Gitweb/blobdiff_plain/c6a68e66fdd8cadd1165a2ff12a2d990721fa72e739f60a3ffcb5f82909f92ea..51260dcf21ff9885b2824f532d504eb4946ee8f5ecf5ebe3d9d00031ec79f5dd:/gitweb.cgi diff --git a/gitweb.cgi b/gitweb.cgi index 162f27f..c497d26 100755 --- a/gitweb.cgi +++ b/gitweb.cgi @@ -14,9 +14,10 @@ use CGI::Util qw(unescape); use CGI::Carp qw(fatalsToBrowser); use Encode; use Fcntl ':mode'; +binmode STDOUT, ':utf8'; my $cgi = new CGI; -my $version = "249"; +my $version = "256"; my $my_url = $cgi->url(); my $my_uri = $cgi->url(-absolute => 1); my $rss_link = ""; @@ -79,8 +80,8 @@ if (defined $project) { undef $project; die_error(undef, "No such project."); } - $rss_link = ""; + $rss_link = ""; $ENV{'GIT_DIR'} = "$projectroot/$project"; } else { git_project_list(); @@ -145,7 +146,7 @@ sub validate_input { if ($input =~ m/(^|\/)(|\.|\.\.)($|\/)/) { return undef; } - if ($input =~ m/[^a-zA-Z0-9_ \.\/\-\+\#\~]/) { + if ($input =~ m/[^a-zA-Z0-9_\x80-\xff\ \t\.\/\-\+\#\~\%]/) { return undef; } return $input; @@ -208,17 +209,31 @@ if (!defined $action || $action eq "summary") { exit; } -sub esc_url { +# quote unsafe chars, but keep the slash, even when it's not +# correct, but quoted slashes look too horrible in bookmarks +sub esc_param { my $str = shift; + $str =~ s/([^A-Za-z0-9\-_.~();\/;?:@&=])/sprintf("%%%02X", ord($1))/eg; $str =~ s/\+/%2B/g; $str =~ s/ /\+/g; return $str; } +# replace invalid utf8 character with SUBSTITUTION sequence sub esc_html { my $str = shift; - $str = escapeHTML($str); $str = decode("utf8", $str, Encode::FB_DEFAULT); + $str = escapeHTML($str); + return $str; +} + +# git may return quoted and escaped filenames +sub unquote { + my $str = shift; + if ($str =~ m/^"(.*)"$/) { + $str = $1; + $str =~ s/\\([0-7]{1,3})/chr(oct($1))/eg; + } return $str; } @@ -302,11 +317,11 @@ a.rss_logo:hover { background-color:#ee5500; } EOF print "