190 lines
5.6 KiB
Perl
Executable file
190 lines
5.6 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
#
|
|
# Send-pr perl script to send a pr.
|
|
#
|
|
# Copyright (c) 1996 Free Range Media
|
|
#
|
|
# Copying and distribution permitted under the conditions of the
|
|
# GNU General Public License Version 2.
|
|
# (http://www.gnu.ai.mit.edu/copyleft/gpl.html)
|
|
#
|
|
# $FreeBSD: www/en/cgi/dosendpr.cgi,v 1.24 2005/11/16 23:35:57 fenner Exp $
|
|
|
|
require "html.pl";
|
|
|
|
use Socket;
|
|
use DB_File;
|
|
use Fcntl qw(:DEFAULT :flock);
|
|
require "./Gnats.pm"; import Gnats;
|
|
|
|
my $blackhole = "dnsbl.njabl.org";
|
|
my $openproxyip = "127.0.0.9";
|
|
my $blackhole_err = 0;
|
|
my $openproxy;
|
|
|
|
my $expiretime = 2700;
|
|
$dbpath = "/usr/local/www/var/confirm-code/sendpr-code.db";
|
|
|
|
# Environment variables to stuff in the PR header.
|
|
my @ENV_captures = qw/ REMOTE_HOST
|
|
REMOTE_ADDR
|
|
REMOTE_PORT
|
|
HTTP_REFERER
|
|
HTTP_CLIENT_IP
|
|
HTTP_FORWARDED
|
|
HTTP_VIA
|
|
HTTP_X_FORWARDED_FOR /;
|
|
|
|
# env2hdr (@ENV_captures)
|
|
# Returns X-header style headers for inclusion in the header of a PR
|
|
sub env2hdr (@) {
|
|
my $headers = "";
|
|
for my $var (shift @_) {
|
|
next unless $ENV{$var};
|
|
$headers .= "X-$var: $ENV{$var}\n";
|
|
}
|
|
return $headers;
|
|
}
|
|
|
|
# isopenproxy ($ip, $blackhole_zone, $positive_ip)
|
|
# Returns undef on error, 0 if DNS lookup fails, $positive_ip if verified
|
|
# proxy. A DNS lookup failing can either means that there was a network
|
|
# problem, or that the IP is not listed in the blackhole zone.
|
|
sub isopenproxy ($$$) {
|
|
# If $? is already set, then a successful gethostbyname() leaves it set
|
|
local $?;
|
|
my ($ip, $zone, $proxyip) = @_;
|
|
my ($reversed_ip, $packed);
|
|
if (!defined $proxyip) { return undef };
|
|
|
|
$reversed_ip = join('.', reverse split(/\./, $ip));
|
|
$packed = gethostbyname("${reversed_ip}.${blackhole}");
|
|
return undef if $?;
|
|
|
|
if ($packed && (inet_ntoa($packed) eq $proxyip)) {
|
|
return $proxyip;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
sub prerror {
|
|
&html_title ("Problem Report Error");
|
|
&html_body();
|
|
print "<p>There is an error in the configuration of the problem\n",
|
|
"report form generator. Please back up one page and report\n",
|
|
"the problem to the owner of that page.<br />",
|
|
"Report <span class=\"prerror\">$_[0]</span>.</p>";
|
|
&html_end();
|
|
exit (1);
|
|
}
|
|
|
|
&www_content ("text","html");
|
|
&cgi_form_in();
|
|
|
|
&prerror("request method problem") if $ENV{'REQUEST_METHOD'} eq 'GET';
|
|
|
|
if (!$submission_program) { &prerror("submit program problem"); }
|
|
|
|
&html_title ("Thank you for the problem report");
|
|
&html_body ();
|
|
|
|
# Verify the data ...
|
|
|
|
$db_obj = tie(%db_hash, 'DB_File', $dbpath, O_CREAT|O_RDWR, 0644)
|
|
or die "dbcreate $dbpath $!";
|
|
$fd = $db_obj->fd;
|
|
open(DB_FH, "+<&=$fd") or die "fdopen $!";
|
|
|
|
unless (flock (DB_FH, LOCK_EX | LOCK_NB)) {
|
|
unless (flock (DB_FH, LOCK_EX)) { die "flock: $!" }
|
|
}
|
|
|
|
$codeentered = $cgi_data{'code-confirm'};
|
|
$codeentered =~ s/.*/\U$&/; # Turn input uppercase
|
|
$currenttime = time();
|
|
if (defined($codeentered) && $codeentered && $db_hash{$codeentered} &&
|
|
(($currenttime - $expiretime) <= $db_hash{$codeentered})) {
|
|
if (!$cgi_data{'email'} || !$cgi_data{'originator'} ||
|
|
!$cgi_data{'synopsis'}) {
|
|
print "<h1>Bad Data</h1><p>You need to specify at least your ",
|
|
"electronic mail address, your name and a synopsis ",
|
|
"of the problem.<br /> Please return to the form and add the ",
|
|
"missing information. Thank you.</p>";
|
|
&html_end();
|
|
|
|
exit(1);
|
|
}
|
|
} else {
|
|
print "<h1>Incorrect safety code</h1><p>You need to enter the correct ",
|
|
"code from the image displayed. Please return to the form and enter the ",
|
|
"code exactly as shown. Thank you.</p>";
|
|
|
|
&html_end();
|
|
|
|
exit(1);
|
|
}
|
|
|
|
# This code has now been used, so remove it.
|
|
delete $db_hash{"$codeentered"};
|
|
|
|
# Sweep for and remove expired codes.
|
|
foreach $randomcode (keys %db_hash) {
|
|
if ( ($currenttime - $expiretime) >= $db_hash{$randomcode}) {
|
|
delete $db_hash{"$randomcode"};
|
|
}
|
|
}
|
|
$db_obj->sync(); # to flush
|
|
flock(DB_FH, LOCK_UN);
|
|
undef $db_obj; # removing the last reference to the DB
|
|
# closes it. Closing DB_FH is implicit.
|
|
untie %db_hash;
|
|
|
|
|
|
$openproxy = isopenproxy($ENV{'REMOTE_ADDR'}, $blackhole, $openproxyip);
|
|
if (defined $openproxy) {
|
|
if ($openproxy) {
|
|
&prerror("$ENV{'REMOTE_ADDR'} is an open proxy server");
|
|
}
|
|
} else {
|
|
$blackhole_err++;
|
|
}
|
|
|
|
# Build the PR.
|
|
$pr = "To: $submission_address\n" .
|
|
"From: $cgi_data{'originator'} <$cgi_data{'email'}>\n" .
|
|
"Subject: $cgi_data{'synopsis'}\n" .
|
|
env2hdr(@ENV_captures);
|
|
if ($blackhole_err) {
|
|
$pr .= "X-REMOTE_ADDR-Is-Open-Proxy: Maybe\n";
|
|
}
|
|
$pr .= "X-Send-Pr-Version: www-2.3\n\n" .
|
|
">Submitter-Id:\t$cgi_data{'submitterid'}\n" .
|
|
">Originator:\t$cgi_data{'originator'}\n" .
|
|
">Organization:\t$cgi_data{'organization'}\n" .
|
|
">Confidential:\t$cgi_data{'confidential'}\n" .
|
|
">Synopsis:\t$cgi_data{'synopsis'}\n" .
|
|
">Severity:\t$cgi_data{'severity'}\n" .
|
|
">Priority:\t$cgi_data{'priority'}\n" .
|
|
">Category:\t$cgi_data{'category'}\n" .
|
|
">Class:\t\t$cgi_data{'class'}\n" .
|
|
">Release:\t$cgi_data{'release'}\n" .
|
|
">Environment:\t$cgi_data{'environment'}\n" .
|
|
">Description:\n$cgi_data{'description'}\n" .
|
|
">How-To-Repeat:\n$cgi_data{'howtorepeat'}\n" .
|
|
">Fix:\n$cgi_data{'fix'}\n";
|
|
|
|
# remove any carrage returns that appear in the report.
|
|
$pr =~ s/\r//g;
|
|
|
|
if (open (SUBMIT, "|$submission_program")){
|
|
|
|
print SUBMIT $pr;
|
|
close (SUBMIT);
|
|
print "<h1>Thank You</h1>",
|
|
"<p>Thank you for the problem report. You should receive confirmation",
|
|
" of your report by electronic mail within a day.</p>";
|
|
} else {
|
|
print "<h1>Error</h1><p>An error occured processing your problem report.</p>";
|
|
}
|
|
&html_end();
|