X-Git-Url: https://git.exim.org/buildfarm-server.git/blobdiff_plain/7696f262f27714edbcf520399a61be1dc7e3e158..491ccf82d69eb51a6a4aeaff87e000e74cac313c:/cgi-bin/register.pl diff --git a/cgi-bin/register.pl b/cgi-bin/register.pl old mode 100644 new mode 100755 index dcd3ab9..80663b6 --- a/cgi-bin/register.pl +++ b/cgi-bin/register.pl @@ -1,92 +1,103 @@ #!/usr/bin/perl +=comment + +Copyright (c) 2003-2010, Andrew Dunstan + +See accompanying License file for license details + +=cut + use strict; use DBI; use Template; use CGI; +use Template; -use vars qw($dbhost $dbname $dbuser $dbpass $dbport $notifyapp); +use vars qw($dbhost $dbname $dbuser $dbpass $dbport $notifyapp + $template_dir $default_host); -require "$ENV{BFConfDir}/BuildFarmWeb.pl"; -#require "BuildFarmWeb.pl"; +use FindBin qw($RealBin); +require "$RealBin/../BuildFarmWeb.pl"; my $dsn="dbi:Pg:dbname=$dbname"; $dsn .= ";host=$dbhost" if $dbhost; $dsn .= ";port=$dbport" if $dbport; -my $header = < - - - - PostgreSQL BuildFarm Application - - - - - -
- -
-EOS - -my $footer = < -
-

-Hosting for the PostgreSQL Buildfarm is generously -provided by: -CommandPrompt, -The PostgreSQL Company -

-
- - -EOS - +my $template_opts = { INCLUDE_PATH => $template_dir}; +my $template = new Template($template_opts); my $query = new CGI; my $params = $query->Vars; -my ($os, $osv, $comp, $compv, $arch, $email, $owner) = @{$params}{ - qw(os osv comp compv arch email owner)}; +my ($os, $osv, $comp, $compv, $arch, $email, $owner, $arg1, $arg2, $argop, $res ) = + @{$params}{qw(os osv comp compv arch email owner arg1 arg2 op res)}; -unless ($os && $osv && $comp && $compv && $arch && $email && $owner) +$argop = '-' if !$argop or $argop ne '+'; +$arg1 = int($arg1 || 0); +$arg2 = int($arg2 || 0); +$res = int($res || 0); +my $captcha_ok = ($arg1 and $argop and $arg2 and $res + and int(eval "$arg1 $argop $arg2") == $res) ? 1 : 0; + +unless ($os && $osv && $comp && $compv && $arch && $email && $owner && + $captcha_ok) { - print "Content-Type: text/html\n\n", - $header, - "

You need to complete all the form items. Please try again.

\n", - $footer; - exit; + print "Content-Type: text/html\n\n"; + $template->process('register-incomplete.tt'); + exit; } -# some idiot has a script that tries to talk to me -# this should catch and dispose of him -if (grep {/\@pgbuildfarm\.org|Content-Type:/} $os,$osv,$comp,$compv,$arch,$email,$owner) +# these filters should catch and dispose of idiots, +# although I hope they are redundant now we're using captchas. + +if ((grep + {/\@pgbuildfarm\.org|Content-Type:|http:|mailto:|href=|None|Unknown/} + $os,$osv,$comp,$compv,$arch,$email,$owner)) { print "Status: 403 Forbidden - go away idiot\n", "Content-Type: text/plain\n\n"; - exit; - + exit; } +# count transitions to and from upper case +my $trans = 1; +my $counttrans = 0; +foreach (split "" ,"$os$osv$comp$compv$arch$owner") +{ + if (/[A-Z]/) + { + next if $trans; + $trans = 1; + $counttrans++; + } + else + { + next unless $trans; + $trans = 0; + $counttrans++; + } +} + +# reject junk with too many transitions into/outof upper case + +=comment + +# disable this check now, probably redundant with captchas +# and we just got a false positive + +if ($counttrans > 20) +{ + print + "Status: 403 Forbidden - go away idiot\n", + "Content-Type: text/plain\n\n"; + exit; +} + +=cut + + my $secret = ""; my $dummyname=""; # we'll select an animal name when we approve it. foreach (1..8) @@ -116,12 +127,10 @@ my $sth=$db->prepare($statement); my $rv=$sth->execute($dummyname,$secret,$os,$osv,$comp,$compv, $arch,$owner,$email); my $err=$db->errstr; -print "Content-type: text/html\n\n"; -print $header - , "

PostgreSQL BuildFarm Application received

\n" - , "

Thank you. You should hear from us shortly.

" - , $footer; +# everything looks OK, so tell them so +print "Content-type: text/html\n\n"; +$template->process('register-ok.tt'); $sth->finish; $db->disconnect; @@ -131,14 +140,17 @@ use Mail::Send; my $msg = new Mail::Send; -my $me = `id -un`; +my $me = `id -un`; chomp($me); +my $host = `hostname`; chomp ($host); +$host = $default_host unless ($host =~ m/[.]/ || !defined($default_host)); -my $host = `hostname`; +my $from_addr = "Exim Build Farm <$me\@$host>"; +$from_addr =~ tr /\r\n//d; -$msg->set('From',"PG Build Farm <$me\@$host>"); +$msg->set('From',$from_addr); $msg->to(@$notifyapp); -$msg->subject('New Buildfarm Application'); +$msg->subject('New BuildFarm Application'); my $fh = $msg->open; print $fh "\n\nName: $dummyname\n", "OS: $os: $osv\n", @@ -146,9 +158,3 @@ print $fh "\n\nName: $dummyname\n", "Comp: $comp: $compv\n", "Owner: $owner <$email>\n"; $fh->close; - - - - - -