From 4ffc1c56881986c122d49223d653942d84bbfe03 Mon Sep 17 00:00:00 2001
From: ajt <>
Date: Thu, 11 Aug 2005 07:57:00 -0800
Subject: [PATCH] [project @ 2005-08-11 08:57:00 by ajt] Improvements to the
CGIs, in particular for moving towards some sane URLs that people needn't be
ashamed to tell other people. Detailed changes from the darcs history:
* allow running cgis from command line (./bugreport.cgi bug=12345)
* support for getting params from cookies
* add cookie setter (cookie.cgi, it's pretty lame)
* initial smart url parser (smarturl.cgi)
* make smarturl actually display bug info
* move per-msg mbox handling into bugurl()
* deprecate mboxurl in favour of bugurl(..., "mbox")
* deprecate dlurl in favour of bugurl too
* replace & in urls with ; so it doesn't get munged by urlsanit :-/
* merge all the pkgreport *url() functions
* initial support for internal links in leet urls
* make bug urls leet too
* cope with attachment filenames, single messages as mbox
"Leet" URLs look like "/x/123456" and "/x/package/dpkg" etc.
---
cgi/bugreport.cgi | 10 ++--
cgi/common.pl | 131 +++++++++++++++++++++++++---------------------
cgi/cookies.cgi | 40 ++++++++++++++
cgi/smarturl.cgi | 96 +++++++++++++++++++++++++++++++++
4 files changed, 211 insertions(+), 66 deletions(-)
create mode 100644 cgi/cookies.cgi
create mode 100644 cgi/smarturl.cgi
diff --git a/cgi/bugreport.cgi b/cgi/bugreport.cgi
index 9c8e8135..a05aa25a 100755
--- a/cgi/bugreport.cgi
+++ b/cgi/bugreport.cgi
@@ -50,7 +50,7 @@ set_option('repeatmerged', $repeatmerged);
my $buglog = buglog($ref);
-if ($ENV{REQUEST_METHOD} eq 'HEAD' and not defined($att) and not $mbox) {
+if (defined $ENV{REQUEST_METHOD} and $ENV{REQUEST_METHOD} eq 'HEAD' and not defined($att) and not $mbox) {
print "Content-Type: text/html; charset=utf-8\n";
my @stat = stat $buglog;
if (@stat) {
@@ -103,7 +103,7 @@ sub display_entity ($$$$\$\@) {
push @dlargs, "filename=$filename" if $filename ne '';
my $printname = $filename;
$printname = 'Message part ' . ($#$attachments + 1) if $filename eq '';
- $$this .= '[$printname } .
+ $$this .= '[$printname } .
"($type, $disposition)]\n\n";
if ($msg and defined($att) and $att eq $#$attachments) {
@@ -375,7 +375,7 @@ sub handle_record{
# Add links to the cloned bugs
$output =~ s{(Bug )(\d+)( cloned as bugs? )(\d+)(?:\-(\d+)|)}{$1.bug_links($2).$3.bug_links($4,$5)}eo;
$output .= 'Full text and rfc822 format available.';
+ bugurl($ref, 'msg='.($msg_number+1), 'mbox') . '">rfc822 format available.';
}
elsif (/recips/) {
my ($msg_id) = $record->{text} =~ /^Message-Id:\s+<(.+)>/im;
@@ -385,7 +385,7 @@ sub handle_record{
elsif (defined $msg_id) {
$$seen_msg_ids{$msg_id} = 1;
}
- $output .= 'View this message in rfc822 format';
+ $output .= 'View this message in rfc822 format';
$output .= '
' .
handle_email_message($record->{text},
ref => $bug_number,
@@ -489,7 +489,7 @@ print "" . "$debbugs::gProject $debbugs::gBug report logs - " . $title . "
\n";
print "$descriptivehead\n";
-printf "View this report as an mbox folder.
\n", mboxurl($ref);
+printf "View this report as an mbox folder.
\n", bugurl($ref, "mbox");
print "
";
print "$log";
print "
";
diff --git a/cgi/common.pl b/cgi/common.pl
index 6270f89c..06357687 100644
--- a/cgi/common.pl
+++ b/cgi/common.pl
@@ -25,6 +25,8 @@ my %common_exclude = ();
my $common_raw_sort = 0;
my $common_bug_reverse = 0;
+my $common_leet_urls = 0;
+
my %common_reverse = (
'pending' => 0,
'severity' => 0,
@@ -178,7 +180,9 @@ sub set_option {
sub readparse {
my ($in, $key, $val, %ret);
- if (defined $ENV{"QUERY_STRING"} && $ENV{"QUERY_STRING"} ne "") {
+ if ($#ARGV >= 0) {
+ $in = join("&", map { s/&/%26/g; s/;/%3b/g; $_ } @ARGV);
+ } elsif (defined $ENV{"QUERY_STRING"} && $ENV{"QUERY_STRING"} ne "") {
$in=$ENV{QUERY_STRING};
} elsif(defined $ENV{"REQUEST_METHOD"}
&& $ENV{"REQUEST_METHOD"} eq "POST")
@@ -187,6 +191,11 @@ sub readparse {
} else {
return;
}
+ if (defined $ENV{"HTTP_COOKIE"}) {
+ my $x = $ENV{"HTTP_COOKIE"};
+ $x =~ s/;\s+/;/g;
+ $in = "$x;$in";
+ }
foreach (split(/[&;]/,$in)) {
s/\+/ /g;
($key, $val) = split(/=/,$_,2);
@@ -200,7 +209,12 @@ sub readparse {
}
$ret{$key}=$val;
}
+
$debug = 1 if (defined $ret{"debug"} && $ret{"debug"} eq "aj");
+
+ $common_leet_urls = 1
+ if (defined $ret{"leeturls"} && $ret{"leeturls"} eq "yes");
+
return %ret;
}
@@ -391,47 +405,32 @@ sub htmlindexentrystatus {
sub urlargs {
my $args = '';
- $args .= "&archive=yes" if $common_archive;
- $args .= "&repeatmerged=no" unless $common_repeatmerged;
- $args .= "&version=$common_version" if defined $common_version;
- $args .= "&dist=$common_dist" if defined $common_dist;
- $args .= "&arch=$common_arch" if defined $common_arch;
+ $args .= ";archive=yes" if $common_archive;
+ $args .= ";repeatmerged=no" unless $common_repeatmerged;
+ $args .= ";version=$common_version" if defined $common_version;
+ $args .= ";dist=$common_dist" if defined $common_dist;
+ $args .= ";arch=$common_arch" if defined $common_arch;
return $args;
}
-sub submitterurl {
- my $ref = shift || "";
- my $params = "submitter=" . emailfromrfc822($ref);
- $params .= urlargs();
- return urlsanit("pkgreport.cgi" . "?" . $params);
-}
-
-sub mainturl {
- my $ref = shift || "";
- my $params = "maint=" . emailfromrfc822($ref);
- $params .= urlargs();
- return urlsanit("pkgreport.cgi" . "?" . $params);
-}
+sub submitterurl { pkg_etc_url(emailfromrfc822($_[0] || ""), "submitter"); }
+sub mainturl { pkg_etc_url(emailfromrfc822($_[0] || ""), "maint"); }
+sub pkgurl { pkg_etc_url($_[0] || "", "pkg"); }
+sub srcurl { pkg_etc_url($_[0] || "", "src"); }
+sub tagurl { pkg_etc_url($_[0] || "", "tag"); }
-sub pkgurl {
+sub pkg_etc_url {
my $ref = shift;
- my $params = "pkg=$ref";
- $params .= urlargs();
- return urlsanit("pkgreport.cgi" . "?" . "$params");
-}
-
-sub srcurl {
- my $ref = shift;
- my $params = "src=$ref";
- $params .= urlargs();
- return urlsanit("pkgreport.cgi" . "?" . "$params");
-}
-
-sub tagurl {
- my $ref = shift;
- my $params = "tag=$ref";
- $params .= urlargs();
- return urlsanit("pkgreport.cgi" . "?" . "$params");
+ my $code = shift;
+ if ($common_leet_urls) {
+ $code = "package" if ($code eq "pkg");
+ $code = "source" if ($code eq "src");
+ return urlsanit("/x/$code/$ref");
+ } else {
+ my $params = "$code=$ref";
+ $params .= urlargs();
+ return urlsanit("pkgreport.cgi" . "?" . $params);
+ }
}
sub urlsanit {
@@ -463,35 +462,45 @@ sub maybelink {
sub bugurl {
my $ref = shift;
my $params = "bug=$ref";
- foreach my $val (@_) {
- $params .= "\&msg=$1" if ($val =~ /^msg=([0-9]+)/);
- $params .= "\&archive=yes" if (!$common_archive && $val =~ /^archive.*$/);
- }
- $params .= "&archive=yes" if ($common_archive);
- $params .= "&repeatmerged=no" unless ($common_repeatmerged);
+ my $filename = '';
- return urlsanit("bugreport.cgi" . "?" . "$params");
-}
+ if ($common_leet_urls) {
+ my $msg = "";
+ my $mbox = "";
+ my $att = "";
+ foreach my $val (@_) {
+ $mbox = "/mbox" if ($val eq "mbox");
+ $msg = "/$1" if ($val =~ /^msg=([0-9]+)/);
+ $att = "/$1" if ($val =~ /^att=([0-9]+)/);
+ $filename = "/$1" if ($val =~ /^filename=(.*)$/);
+ }
+ my $ext = "";
+ if ($mbox ne "") {
+ $ext = $mbox;
+ } elsif ($att ne "") {
+ $ext = "$att$filename";
+ }
+ return urlsanit("/x/$ref$msg$ext");
+ } else {
+ foreach my $val (@_) {
+ $params .= ";mbox=yes" if ($val eq "mbox");
+ $params .= ";msg=$1" if ($val =~ /^msg=([0-9]+)/);
+ $params .= ";att=$1" if ($val =~ /^att=([0-9]+)/);
+ $filename = $1 if ($val =~ /^filename=(.*)$/);
+ $params .= ";archive=yes" if (!$common_archive && $val =~ /^archive.*$/);
+ }
+ $params .= ";archive=yes" if ($common_archive);
+ $params .= ";repeatmerged=no" unless ($common_repeatmerged);
-sub dlurl {
- my $ref = shift;
- my $params = "bug=$ref";
- my $filename = '';
- foreach my $val (@_) {
- $params .= "\&$1=$2" if ($val =~ /^(msg|att)=([0-9]+)/);
- $filename = $1 if ($val =~ /^filename=(.*)$/);
- }
- $params .= "&archive=yes" if ($common_archive);
- my $pathinfo = '';
- $pathinfo = '/'.uri_escape($filename) if $filename ne '';
+ my $pathinfo = '';
+ $pathinfo = '/'.uri_escape($filename) if $filename ne '';
- return urlsanit("bugreport.cgi$pathinfo?$params");
+ return urlsanit("bugreport.cgi" . $pathinfo . "?" . $params);
+ }
}
-sub mboxurl {
- my $ref = shift;
- return urlsanit("bugreport.cgi" . "?" . "bug=$ref&mbox=yes");
-}
+sub dlurl { bugurl(@_); }
+sub mboxurl { return bugurl($ref, "mbox"); }
sub allbugs {
return @{getbugs(sub { 1 })};
diff --git a/cgi/cookies.cgi b/cgi/cookies.cgi
new file mode 100644
index 00000000..370b0bcf
--- /dev/null
+++ b/cgi/cookies.cgi
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -w
+
+use strict;
+use POSIX qw(strftime);
+require './common.pl';
+
+$ENV{"HTTP_COOKIES"} = "";
+my %param = readparse();
+
+my $clear = (defined $param{"clear"} && $param{"clear"} eq "yes");
+my @time_now = gmtime(time());
+my $time_future = strftime("%a, %d-%b-%Y %T GMT",
+ 59, 59, 23, 31, 11, $time_now[5]+10);
+my $time_past = strftime("%a, %d-%b-%Y %T GMT",
+ 59, 59, 23, 31, 11, $time_now[5]-10);
+
+my @cookie_options = qw(repeatmerged terse reverse trim);
+
+print "Content-Type: text/html; charset=utf-8\n";
+
+for my $c (@cookie_options) {
+ if (defined $param{$c}) {
+ printf "Set-Cookie: %s=%s; expires=%s; domain=%s; path=/\n",
+ $c, $param{$c}, $time_future, "bugs.debian.org";
+ } elsif ($clear) {
+ printf "Set-Cookie: %s=%s; expires=%s; domain=%s; path=/\n",
+ $c, "", $time_past, "bugs.debian.org";
+ }
+}
+print "\n";
+print "Cookies set!\n";
+for my $c (@cookie_options) {
+ if (defined $param{$c}) {
+ printf "
Set %s=%s\n", $c, $param{$c};
+ } elsif ($clear) {
+ printf "
Cleared %s\n", $c;
+ } else {
+ printf "
Didn't touch %s (use clear=yes to clear)\n", $c;
+ }
+}
diff --git a/cgi/smarturl.cgi b/cgi/smarturl.cgi
new file mode 100644
index 00000000..f911d103
--- /dev/null
+++ b/cgi/smarturl.cgi
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -wT
+
+package debbugs;
+
+use strict;
+
+#require '/usr/lib/debbugs/errorlib';
+require './common.pl';
+
+require '/etc/debbugs/config';
+require '/etc/debbugs/text';
+
+use vars qw($gPackagePages $gWebDomain);
+
+if (defined $ENV{REQUEST_METHOD} and $ENV{REQUEST_METHOD} eq 'HEAD') {
+ print "Content-Type: text/html; charset=utf-8\n\n";
+ exit 0;
+}
+
+my $path = $ENV{PATH_INFO};
+my %param = readparse();
+
+if ($path =~ m,^/(\d+)(/(\d)+(/.*)?)?$,) {
+ my $bug = $1;
+ my $msg = $3;
+ my $rest = $4;
+
+ my @args = ("bug=$bug");
+ push @args, "msg=$msg" if (defined $msg);
+ if ($rest eq "") {
+ 1;
+ } elsif ($rest eq "/mbox") {
+ push @args, "mbox=yes";
+ } elsif ($rest =~ m,^/att/(\d+)(/[^/]+)?$,) {
+ push @args, "att=$1";
+ push @args, "filename=$2" if (defined $2);
+ } else {
+ bad_url();
+ }
+
+ { $ENV{"PATH"}="/bin"; exec "./bugreport.cgi", "leeturls=yes", @args; }
+
+ print "Content-Type: text/html; charset=utf-8\n\n";
+ print "
Couldn't execute bugreport.cgi!!";
+ exit(0);
+} else {
+ my $suite;
+ my $arch;
+ if ($path =~ m,^/suite/([^/]*)(/.*)$,) {
+ $suite = $1; $path = $2;
+ } elsif ($path =~ m,^/arch/([^/]*)(/.*)$,) {
+ $arch = $1; $path = $2;
+ } elsif ($path =~ m,^/suite-arch/([^/]*)/([^/]*)(/.*)$,) {
+ $suite = $1; $arch = $2; $path = $3;
+ }
+
+ my $type;
+ my $what;
+ my $selection;
+ if ($path =~ m,^/(package|source|maint|submitter|severity|tag|user-tag)/([^/]+)(/(.*))?$,) {
+ $type = $1; $what = $2; $selection = $4 || "";
+ if ($selection ne "") {
+ unless ($type =~ m,^(package|source|user-tag)$,) {
+ bad_url();
+ }
+ }
+ my @what = split /,/, $what;
+ my @selection = split /,/, $selection;
+ my $typearg = $type;
+ $typearg = "pkg" if ($type eq "package");
+ $typearg = "src" if ($type eq "source");
+
+ my @args = ();
+ push @args, $typearg . "=" . join(",", @what);
+ push @args, "version=" . join(",", @selection)
+ if ($type eq "package" and $#selection >= 0);
+ push @args, "utag=" . join(",", @selection)
+ if ($type eq "user-tag" and $#selection >= 0);
+ push @args, "arch=" . $arch if (defined $arch);
+ push @args, "suite=" . $suite if (defined $suite);
+
+ { $ENV{"PATH"}="/bin"; exec "./pkgreport.cgi", "leeturls=yes", @args }
+
+ print "Content-Type: text/html; charset=utf-8\n\n";
+ print "
Couldn't execute pkgreport.cgi!!";
+ exit(0);
+ } else {
+ bad_url();
+ }
+}
+
+sub bad_url {
+ print "Content-Type: text/html; charset=utf-8\n\n";
+ print "
Bad URL :(\n";
+ exit(0);
+}
--
2.39.5