git: 9da657b7c4 - main - refactor out mail archive cgi script

From: Wolfram Schneider <wosch_at_FreeBSD.org>
Date: Mon, 13 Feb 2023 22:17:49 UTC
The branch main has been updated by wosch:

URL: https://cgit.FreeBSD.org/doc/commit/?id=9da657b7c4bca442735c1563a923c8b3993f3181

commit 9da657b7c4bca442735c1563a923c8b3993f3181
Author:     Wolfram Schneider <wosch@FreeBSD.org>
AuthorDate: 2023-02-13 22:16:59 +0000
Commit:     Wolfram Schneider <wosch@FreeBSD.org>
CommitDate: 2023-02-13 22:16:59 +0000

    refactor out mail archive cgi script
    
    The cgi scripts are moved to the mail archive repo along with the
    current/weekly mail archive maintenance scripts. This makes it much easier
    to keep them in sync and up to date.
---
 website/content/en/cgi/getmsg.cgi    | 248 -----------------------------------
 website/content/en/cgi/mailindex.cgi | 111 ----------------
 website/content/en/cgi/mid.cgi       | 161 -----------------------
 3 files changed, 520 deletions(-)

diff --git a/website/content/en/cgi/getmsg.cgi b/website/content/en/cgi/getmsg.cgi
deleted file mode 100755
index 272ad44309..0000000000
--- a/website/content/en/cgi/getmsg.cgi
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/usr/bin/perl -T
-#
-# Given a filename, start offset and end offset of a mail message,
-# read the message and format it nicely using HTML.
-#
-# by John Fieber
-# February 26, 1998
-#
-# $FreeBSD$
-#
-
-require "./cgi-lib.pl";
-require "./cgi-style.pl";
-use POSIX qw(strftime);
-#
-# Site design includes setting a:visited to the same as a:link,
-# which isn't good in archived messages, e.g., you want to follow
-# links in commit messages and know which links you've visited.
-# Override it inside the <pre> that is the message.
-$t_style = qq`<style type="text/css">
-pre a:visited { color: #220000; }
-</style>
-`;
-
-
-#
-# Files MUST be fully qualified and MUST start with this path.
-#
-$messagepath = "/usr/local/www/mailindex/archive/";
-$messagepathcurrent = "/usr/local/www/mid/archive/";
-$ftparchive = 'ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/mailing-lists/archive';
-
-&ReadParse(*formdata);
-&Fetch($formdata{'fetch'});
-exit 0;
-
-sub Fetch
-{
-    my ($docid) = @_;
-    my ($start, $end, $file, $type) = split(/ /, $docid);
-    my ($message, @finfo);
-
-    #
-    # Check to ensure that (a) the specified file starts
-    # with an approved pathname and (b) that it contains no
-    # relative components (eg ..).  This is so that arbitrary
-    # files cannot be accessed.
-    #
-
-    $file =~ s/\.\.//g;
-    $file =~ s|/+|/|;
-    $file =~ s|^archive/|$messagepath/|;
-
-    my $valid_list_name = '^current/(aic7xxx|archbsd|ctm|cvs|dev|freebsd|netperf|oi|p4|soc|svn|trustedbsd|vendors)(-[a-z0-9-]+)?$';
-
-    # read the full archive 
-    if ($type eq 'archive') {
-	# from the FreeBSD ftp server
-	if ($file =~ s%^$messagepath%%o) {
-	    print "Location: $ftparchive/$file.gz\n";
-	    print "Content-type: text/plain\n\n";     
-	    exit(0);
-	}
-	
-	# from the local mail archive for current mails
-	elsif ($file =~ /$valid_list_name/ &&
-	       open(DATA, "$messagepathcurrent$file")) {
-	    print "Content-type: text/plain\n\n"; 
-	    while(<DATA>) {
-		print;
-	    }
-	    close(DATA);
-	    exit(0);
-	}
-    }
-
-    if (($file =~ /^$messagepath/ && -f $file && open(DATA, $file)) ||
-	($file =~ /$valid_list_name/ &&
-	 open(DATA, "$messagepathcurrent$file")))
-    {
-	@finfo = stat DATA;
-    	seek DATA, $start, 0;
-	if ($end > $start && $start >= 0) {
-	    read DATA, $message, $end - $start;
-	} else {
-	    # Unknown length, guess the end of the E-Mail
-	    my($newline) = 0;
-	    while(<DATA>) {
-		last if ($newline && /^From .* \d{4}/);
-		if (/^$/) { $newline = 1 } else { $newline = 0; }
-		$message .= $_;
-	    }
-	}
-    	close(DATA);
-	print "last-modified: " .
-	    POSIX::strftime("%a, %d %b %Y %T GMT", gmtime($finfo[9])) . "\n";
-
-	# print E-Mail as plain ascii text
-	if ($type eq 'raw') {
-            print "Content-type: text/plain\n\n";
-            print $message;
-	    return;
-        }	
-	$message = &MessageToHTML($message, $file);
-    }
-    else
-    {
-    	$message = "<p>The specified message cannot be accessed.</p>\n";
-	warn "$0: error open '$file' $!\n";
-    }
-
-    print &short_html_header("FreeBSD Mail Archives");
-    print $message;
-    print &html_footer;
-}
-
-sub EscapeHTML
-{
-    my ($text) = @_;
-    $text =~ s/&/&amp;/g;
-    $text =~ s/</&lt;/g;
-    $text =~ s/>/&gt;/g;
-    return $text;
-}
-
-sub MessageToHTML
-{
-    my ($doc, $file) = @_;
-    my ($header, $body) = split(/\n\n/, $doc, 2);
-    my ($i, %hdr, $field, $data, $message);
-    my ($mid) = 'mid.cgi';
-    my ($mid_full_url) = 'https://docs.FreeBSD.org/cgi/mid.cgi';
-    my ($tmid,$tirt,$tref);
-    
-    $body = &AddAnchors(&EscapeHTML($body));
-
-    $header = &EscapeHTML($header);
-    $header =~ s/\n[ \t]+/ /g;
-
-    foreach $i (split(/\n/, $header)) {
-    	($field, $data) = split(/ /, $i, 2);
-	$field =~ y/A-Z/a-z/;
-    	$hdr{$field} = $data;
-    }
-
-    $message = "<pre>\n";
-    if (length($hdr{'date:'}) > 0) {
-    	$message .= "<strong>Date: </strong>     $hdr{'date:'}\n";
-    }
-    if (length($hdr{'from:'}) > 0) {
-    	$message .= "<strong>From: </strong>     $hdr{'from:'}\n";
-    }
-    if (length($hdr{'to:'}) > 0) {
-    	$message .= "<strong>To: </strong>       $hdr{'to:'}\n";
-    }
-    if (length($hdr{'cc:'}) > 0) {
-    	$message .= "<strong>Cc: </strong>       $hdr{'cc:'}\n";
-    }
-#    if (length($hdr{'sender:'}) > 0) {
-#    	$message .= "<strong>Sender: </strong>   $hdr{'sender:'}\n";
-#    }
-    if (length($hdr{'subject:'}) > 0) {
-    	$message .= "<strong>Subject: </strong>  $hdr{'subject:'}\n";
-    }
-
-    if ($hdr{'message-id:'}) {
-	$tmid = $hdr{'message-id:'}; 
-	$hdr{'message-id:'} =~ 
-	    s%;([^&]+)&%;<a href="$mid?db=irt&amp;id=$1">$1</a>&%oi;
-	$message .= "<strong>Message-ID: </strong> $hdr{'message-id:'}\n";
-    }
-
-    if ($hdr{'resent-message-id:'}) {
-	$hdr{'resent-message-id:'} =~ 
-	    s%;([^&]+)&%;<a href="$mid?db=irt&amp;id=$1">$1</a>&%oi;
-	$message .= "<strong>Resent-Message-ID: </strong>$hdr{'resent-message-id:'}\n";
-    }
-
-    if ($hdr{'in-reply-to:'}) {
-	$tirt = $hdr{'in-reply-to:'};
-	$hdr{'in-reply-to:'} =~
-	    s%;([^&]+)&%;<a href="$mid?db=mid&amp;id=$1">$1</a>&%oi;
-	$message .= "<strong>In-Reply-To: </strong>$hdr{'in-reply-to:'}\n";
-    }
-
-    if ($hdr{'references:'}) {
-	$tref = $hdr{'references:'};
-	$hdr{'references:'} =~
-	    s%;([^&\s]+)&%;<a href="$mid?db=mid&amp;id=$1">$1</a>&%goi;
-	$message .= "<strong>References: </strong> $hdr{'references:'}\n";
-    }
-
-
-    $message .= "</pre>\n";
-    $message .= "<hr noshade=\"noshade\"/>\n";
-
-    if ($tmid =~ m%;([^&]+)&%) {
-	$message .= qq{<a href="$mid?db=irt&amp;id=$1">Next in thread</a>\n};
-    }
-
-    if ($tirt  =~ m%;([^&]+)&% ||
-	$tref  =~ m%;([^&]+)&%) {
-	$message .= qq{| <a href="$mid?db=mid&amp;id=$1">Previous in thread</a>\n};
-    }
-    $message .= qq{| <a href="$ENV{'REQUEST_URI'}+raw">Raw E-Mail</a>\n};
-    my $file2 = $file;
-    if ($file2 =~ s%^$messagepath%archive/%oi ||
-	$file2 =~ /^current/) {
-    	$message .= qq{| <a href="/mail/$file2.html">Index</a>\n};
-    }
-    $message .= qq{| <a href="$ENV{'REQUEST_URI'}+archive">Archive</a>\n};
-    $message .= qq{| <a href="../search/searchhints.html">Help</a>\n};
-
-    my $tid = $tmid;
-    $tid =~ s/^&lt;//;
-    $tid =~ s/\@.*//;
-
-    $message .= "<hr noshade=\"noshade\"/>\n";
-    #$message .= qq{<div onclick="document.location='$mid_full_url?db=irt&amp;id=$tid'">\n};
-    $message .= "<pre>\n$body\n</pre>\n";
-    #$message .= qq{</div>\n};
-
-    $message .= qq{<hr/>\n<p>Want to link to this message? Use this URL: &lt;};
-    $message .= qq{<a href="} . $mid_full_url . '?' . $tid;
-    $message .= qq{">$mid_full_url} . '?' . $tid . qq{</a>&gt;</p>};
-    
-    return $message;
-}
-
-sub strip_url
-{
-    my $url = shift;
-
-    # strip trailing characters
-    $url =~ s/&gt;?$//;
-    $url =~ s/[.,;>\s\)]*$//;
-
-    return $url;
-}
-
-sub AddAnchors
-{
-    my ($text) = @_;
-
-    $text =~ s/(http|https|ftp)(:[\S]*?\/?)(\W?\s)/sprintf("<a href=\"%s\">%s<\/a>$3", &strip_url("$1$2"), "$1$2", $3)/egoi;
-
-    return $text;
-}
diff --git a/website/content/en/cgi/mailindex.cgi b/website/content/en/cgi/mailindex.cgi
deleted file mode 100755
index 249da5f041..0000000000
--- a/website/content/en/cgi/mailindex.cgi
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/perl -T
-#
-# Copyright (c) Jan 1999-2011 Wolfram Schneider <wosch@FreeBSD.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-
-
-use CGI;
-use CGI::Carp;
-
-require "./cgi-lib.pl";
-require "./cgi-style.pl";
-
-$ENV{PATH} = "/bin:/usr/bin:/usr/local/bin";
-
-# no sort
-my $sortopt = '';
-my $up = 0;
-
-$| = 1;
-
-# mail archive location
-$maildir = '/home/mail/archive';
-
-# mailindex program
-$mailindex = '/usr/local/www/mailindex/bin/mailindex';
-
-
-$query = new CGI();
-
-print "Content-type: text/html\n\n";
-
-my $reverse;
-$sortopt = '--sort-by-subject' if ($query->param('sort') eq 'subject');
-$sortopt = '--sort-by-author'  if ($query->param('sort') eq 'author');
-$sortopt = '' if ($query->param('sort') eq 'date');
-
-$reverse = '--reverse'  if ($query->param('reverse'));
-
-my $file = $query->param('file');
-if (!$file) {
-    print "No file name given\n";
-    exit;
-}
-
-# forbid link to parent directories
-$file =~ s%\.\./%%g;
-if ($file =~ m,^([0-9a-z/-]+|[0-9a-z/-]+\.[0-9a-z-]+)$,) {
-    $file = $1;
-} else {
-    print "Unknown file name given\n";
-    exit;
-} 
-	
-
-sub file_not_exists {
-    my $file = shift;
-    print "File does not exist: $file\n";
-    exit;
-}
-
-if ($file =~ s%^archive/%%) {
-    $maildir = '/usr/local/www/mailindex/archive';
-    &file_not_exists("$maildir/$file") if (! -f "$maildir/$file");
-} elsif ($file =~ s%^current/%% && $file =~ /^(freebsd|cvs|svn|ctm|trustedbsd)-/) {
-    &file_not_exists("$file") if (! -f "$maildir/$file");
-    $up = 0;
-} else {
-    &file_not_exists("$file");
-}
-
-chdir($maildir) or die "chdir $maildir: $!\n";
-
-my @options;
-push(@options, ("--up=$up", '--outdir=stdout', '--cgilink=1'));
-push(@options, $sortopt) if $sortopt;
-push(@options, $reverse) if $reverse;
-
-open(M, "-|") || exec "$mailindex",  @options, $file || do {
-    print "Cannot open $mailindex: $!\n";
-    exit;
-};
-
-#print "cd $maildir; $mailindex  @options $file\n";
-while(<M>) {
-    print;
-}
-
-exit;
diff --git a/website/content/en/cgi/mid.cgi b/website/content/en/cgi/mid.cgi
deleted file mode 100755
index 12c9f255f3..0000000000
--- a/website/content/en/cgi/mid.cgi
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/perl -T
-#
-# Copyright (c) March 1998-2021 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# Search a mail by Message-ID, References or In-Reply-To field
-#
-# $FreeBSD$
-
-require "./cgi-lib.pl";
-require "./cgi-style.pl";
-
-$home = '/usr/local/www/mailindex';
-$prefix= "/usr/local/www/mailindex/archive";
-$lookupdir = "$home/message-id"; # database(s) directory
-$databaseDefault = 'mid';           # default database
-$script = $ENV{'SCRIPT_NAME'};
-$shortid = 1;
-$lookCommand = "/usr/bin/look";
-$ENV{PATH} = '/bin:/usr/bin';
-
-$main::t_style .= qq{\n<link rel="search" type="application/opensearchdescription+xml" href="https://www.freebsd.org/opensearch/message-id.xml" title="FreeBSD M-ID" />\n};
-
-sub escape($) { $_ = $_[0]; s/&/&amp;/g; s/</&lt;/g; s/>/&gt;/g; $_; }
-
-sub get_id {
-    local($query, $db) = @_;
-
-    open(DB,  "-|") ||
-	exec("$lookCommand", $query, "$lookupdir/mid-current.$db") ||
-	do {
-	    print &midheader .
-		"<p>Cannot connect to Message-ID database.</p>\n" . &foot;
-    exit;
-    	};
-
-    local(@idlist);
-    while(<DB>) {
-	push(@idlist, $_);
-    }
-    close DB;
-    #warn "$lookCommand $query, $lookupdir/mid.$db";
-    open(DB,  "-|") ||
-	exec("$lookCommand", $query, "$lookupdir/mid.$db") ||
-	do {
-	    print &midheader .
-		"<p>Cannot connect to Message-ID database.</p>\n" . &foot;
-	    exit;
-    	};
-
-    while(<DB>) {
-	push(@idlist, $_);
-    }
-    close DB;
-
-
-    if ($#idlist < 0) {           # nothing found
-	print &midheader;
-	if ($db eq 'mid') {
-	    printf "Message-ID: \"%s\" not found\n", escape($query);
-	} else {
-	    printf "No answers found for: \"%s\"\n", escape($query);
-	}
-	print &foot;
-
-    } elsif ($#idlist == 0) {     # one hit
-	local($location) = $ENV{'SCRIPT_NAME'};
-	local($id, $file, $start) = split($", $idlist[0]);
-	$location =~ s%/[^/]+$%%;
-	local($host) = $ENV{'HTTP_HOST'};
-	$location = '//' . $host . $location;
-	$start =~ s/\s+$//;
-
-	print "Location: $location/getmsg.cgi?fetch=$start+0+" .
-		($file =~ /^current/ ?  '' :  "$prefix/") . "$file\n";
-	print "Content-type: text/plain\n\n";
-	exit;
-
-    } else {                      # more than one hit
-	local($id, $file, $start, $name);
-	print &midheader;
-	print "<ul>\n";
-	foreach (@idlist) {
-	    ($id, $file, $start) = split;
-	    $name = $file;
-	    $name =~ s%.*/%%;
-	    $name =~ s%(....)(..)(..)\.%$1-$2-$3 %;
-	    print qq{<li><a href="getmsg.cgi?fetch=$start+0+} .
-                ($file =~ /^current/ ? '' : "$prefix/") .
-		qq{$file">$name $start</a></li>\n};
-	}
-	print "</ul>\n<p></p>\n";
-	print &foot;
-    }
-}
-
-sub midheader {
-    return &short_html_header("FreeBSD Message-ID Mail Archives") .
-	qq{<p><a href="$hsty_base/search/">Back to the search interface</a></p>\n};
-}
-
-sub foot { return &html_footer; }
-
-###
-# Main
-###
-
-&ReadParse(*input);
-$messageid = $input{'id'};
-$database = $input{'db'};
-
-
-if (!$messageid) {
-    # for lazy people ;-)
-    # allow the syntax  mid.cgi?messageid
-    if ($ENV{'QUERY_STRING'} =~ /<?[a-z0-9._>\-]+\S+$/) {
-	$messageid = $ENV{'QUERY_STRING'};
-	$database = $databaseDefault;
-    } 
-
-    # no message-id given
-    else {
-	print  &midheader;
-	print "No input given\n";
-	print &foot; exit;
-    }
-}
-
-$messageid =~ s/^<//;
-$messageid =~ s/>$//;
-$messageid =~ s/@.*// if $shortid;
-($messageid) = $messageid =~ m|^(\S+)$|;	# XXX: can be more strict...
-
-if ($database =~ m/^(mid|irt)$/) {
-    $database = $1;
-} else {
-    $database = $databaseDefault;
-}
-
-&get_id($messageid, $database);