=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 1.1.1.21 retrieving revision 1.1.1.26 diff -u -p -r1.1.1.21 -r1.1.1.26 --- cvsweb/cvsweb.cgi 2001/01/12 04:17:16 1.1.1.21 +++ cvsweb/cvsweb.cgi 2001/06/05 10:56:15 1.1.1.26 @@ -18,7 +18,7 @@ # Copyright (c) 1996-1998 Bill Fenner # (c) 1998-1999 Henner Zeller # (c) 1999 Henrik Nordstrom -# (c) 2000 Akinori MUSHA +# (c) 2000-2001 Akinori MUSHA # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -42,8 +42,8 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $zId: cvsweb.cgi,v 1.104 2000/11/01 22:05:12 hnordstrom Exp $ -# $kId: cvsweb.cgi,v 1.63 2001/01/11 23:42:01 knu Exp $ +# $zId: cvsweb.cgi,v 1.106 2001/03/10 01:16:27 hnordstrom Exp $ +# $Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.74 2001/06/05 04:46:21 knu Exp $ # ### @@ -52,6 +52,7 @@ require 5.000; use strict; use vars qw ( + $cvsweb_revision $mydir $uname $config $allow_version_select $verbose @CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES @@ -138,6 +139,10 @@ sub forbidden_module($); ##### Start of Configuration Area ######## delete $ENV{PATH}; +$cvsweb_revision = '1.106' . '.' . (split(/ /, + q$Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.74 2001/06/05 04:46:21 knu Exp $ +))[2]; + use File::Basename; ($mydir) = (dirname($0) =~ /(.*)/); # untaint @@ -248,7 +253,7 @@ $where =~ s|^/||; $scriptname = defined($ENV{SCRIPT_NAME}) ? $ENV{SCRIPT_NAME} : ''; $scriptname =~ s|^/*|/|; -# Let's workaround thttpd's stupidness.. +# Let's workaround thttpd's stupidity.. if ($scriptname =~ m|/$|) { $pathinfo .= '/'; my $re = quotemeta $pathinfo; @@ -304,9 +309,7 @@ if (-f $config) { } else { &fatal("500 Internal Error", 'Configuration not found. Set the variable $config ' - . 'in cvsweb.cgi, or the environment variable ' - . 'CVSWEB_CONFIG, to your cvsweb.conf ' - . 'configuration file first.'); + . 'in cvsweb.cgi to your cvsweb.conf configuration file first.'); } undef %input; @@ -733,7 +736,8 @@ if (-d $fullname) { if ($_ eq '..' || -d "$fullname/$_") { next if ($_ eq '..' && $where eq '/'); - my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} + my ($rev,$date,$log,$author,$filename); + ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} if (defined($fileinfo{$_})); printf '', $tabcolors[$dirrow % 2] if $dirtable; if ($_ eq '..') { @@ -744,10 +748,10 @@ if (-d $fullname) { else { print &link($backicon, $url); } - print " ", &link("Previous Directory", $url); + print " ", &link("Parent Directory", $url); } else { - $url = urlencode($_) . "/$query"; + $url = './' . urlencode($_) . "/$query"; print ""; if ($nofilelinks) { print $diricon; @@ -810,7 +814,7 @@ if (-d $fullname) { } elsif (s/,v$//) { $fileurl = ($attic ? "Attic/" : "") . urlencode($_); - $url = $fileurl . $query; + $url = './' . $fileurl . $query; my $rev = ''; my $date = ''; my $log = ''; @@ -908,7 +912,7 @@ if (-d $fullname) { &link("Download this directory in tarball", # Mangle the filename so browsers show a reasonable # filename to download. - "$basefile.tar.gz$query". + "./$basefile.tar.gz$query". ($query ? "&" : "?")."tarball=1"), ""; } @@ -1102,11 +1106,11 @@ sub findLastModifiedSubdirs(@) { sub htmlify_sub(&$) { (my $proc, local $_) = @_; - local @_ = split(m`(]+>[^<]*)`i); + my @a = split(m`(]+>[^<]*)`i); my $linked; my $result = ''; - while (($_, $linked) = splice(@_, 0, 2)) { + while (($_, $linked) = splice(@a, 0, 2)) { &$proc(); $result .= $_ if defined($_); $result .= $linked if defined($linked); @@ -1222,6 +1226,8 @@ sub spacedHtmlText($;$) { sub link($$) { my($name, $url) = @_; + $url =~ s/:/sprintf("%%%02x", ord($&))/eg if $url =~ /^[^a-z]/; # relative + sprintf '%s', hrefquote($url), $name; } @@ -1299,6 +1305,7 @@ sub safeglob($) { push(@results, "$dirname/" .$_); } } + closedir($dh); } @results; @@ -1407,7 +1414,7 @@ sub doAnnotate($$) { # the public domain. # we could abandon the use of rlog, rcsdiff and co using # the cvsserver in a similiar way one day (..after rewrite) - $pid = open2($reader, $writer, "cvs", @cvs_options, "server") + $pid = open2($reader, $writer, $CMD{cvs}, @cvs_options, "server") || fatal ("500 Internal Error", "Fatal Error - unable to open cvs for annotation"); # OK, first send the request to the server. A simplified example is: @@ -1698,7 +1705,11 @@ sub cvswebMarkup($$$) { print ""; } else { - print "\n", <$filehandle>; + print "<PRE>"; + while (<$filehandle>) { + print htmlquote($_); + } + print "</PRE>"; } } @@ -1765,7 +1776,7 @@ sub doDiff($$$$$$) { while (($re1, $re2) = each %funcline_regexp) { if ($fullname =~ /$re1/) { - push @difftype, '-F', '$re2'; + push @difftype, '-F', $re2; last; } } @@ -2634,8 +2645,8 @@ sub human_readable_diff($){ print "<br>Tag: $sym2\n" if ($sym1); print "</th>\n"; - my $fs = "<font face=\"$difffontface\" size=\"$difffontsize\">"; - my $fe = "</font>"; + my $fs = "<font face=\"$difffontface\" size=\"$difffontsize\"><tt>"; + my $fe = "</tt></font>"; my $leftRow = 0; my $rightRow = 0; @@ -2657,6 +2668,7 @@ sub human_readable_diff($){ if ($difftxt =~ /^@@/) { ($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; + $funname = htmlquote($funname); print "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">"; print "<table width=\"100%\" border=1 cellpadding=5><tr><td><b>Line $oldline</b>"; print "&nbsp;<font size=-1>$funname</font></td></tr></table>"; @@ -2751,17 +2763,22 @@ sub human_readable_diff($){ sub navigateHeader($$$$$) { my ($swhere,$path,$filename,$rev,$title) = @_; $swhere = "" if ($swhere eq $scriptwhere); - $swhere = urlencode($filename) if ($swhere eq ""); - print qq`<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">`; - print "<HTML>\n<HEAD>\n"; - print qq`<META name="robots" content="nofollow">\n`; - print '<!-- CVSweb $zRevision: 1.104 $ $kRevision: 1.63 $ -->'; - print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; - print "$body_tag_for_src\n"; - print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">"; - print "<tr valign=bottom><td>"; + $swhere = './' . urlencode($filename) if ($swhere eq ""); + + print <<EOF; +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<META name="robots" content="nofollow"> +<!-- knu-cvsweb $cvsweb_revision --> +<TITLE>$path$filename - $title - $rev</TITLE></HEAD> +$body_tag_for_src +<table width="100%" border=0 cellspacing=0 cellpadding=1 bgcolor="$navigationHeaderColor"> +<tr valign=bottom><td> +EOF + print &link($backicon, "$swhere$query#rev$rev"); - print "</a> <b>Return to ", &link("$filename","$swhere$query#rev$rev")," CVS log"; + print "<b>Return to ", &link($filename,"$swhere$query#rev$rev")," CVS log"; print "</b> $fileicon</td>"; print "<td align=right>$diricon <b>Up to ", &clickablePath($path, 1), "</b></td>"; @@ -2979,6 +2996,8 @@ sub download_link($$$;$) { my ($url, $revision, $textlink, $mimetype) = @_; my ($fullurl) = download_url($url, $revision, $mimetype); + $fullurl =~ s/:/sprintf("%%%02x", ord($&))/eg; + printf '<A HREF="%s"', hrefquote("$fullurl$barequery"); if ($open_extern_window && (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { @@ -3150,7 +3169,6 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.104 $ $kRevision: 1.63 $'; #' http_header("text/html"); print <<EOH; <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" @@ -3159,7 +3177,7 @@ sub html_header($) { <head> <meta name="robots" content="nofollow"> <title>$title</title> -<!-- CVSweb $version --> +<!-- knu-cvsweb $cvsweb_revision --> </head> $body_tag $logo <h1 align="center">$title</h1> @@ -3176,7 +3194,7 @@ sub link_tags($) { my ($fileurl,$filename); ($filename = $where) =~ s/^.*\///; - $fileurl = urlencode($filename); + $fileurl = './' . urlencode($filename); foreach my $sym (split(", ", $tags)) { $ret .= ",\n" if ($ret ne "");