X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fcommod-update-receiver;h=90c9c4beb01e8896bc93d41502e1eeb564baa906;hb=b99e2f9531a0d06479d6e05fbd54816a07559469;hp=2c409f48d4b4ce7557d85a9380a25a6ead30a24a;hpb=fd1dfe6db4a898d7e96a577c68599fc992238326;p=ypp-sc-tools.db-test.git diff --git a/pctb/commod-update-receiver b/pctb/commod-update-receiver index 2c409f4..90c9c4b 100755 --- a/pctb/commod-update-receiver +++ b/pctb/commod-update-receiver @@ -63,13 +63,13 @@ sub must_param ($$) { my ($n,$re)= @_; my $v= param($n); fail("missing form parameter $n") unless defined $v; - fail("invalid form parameter $n") unless $v =~ m/$re/; + fail("invalid form parameter $n ($re)") unless $v =~ m/$re/; return $1; } my $clientname= must_param('clientname',$re_any); my $clientinfo= $clients{$clientname}; -fail('unknown client') unless defined $client; +fail('unknown client') unless defined $clientinfo; my $clientfixes= must_param('clientfixes', "^([-0-9a-z ]*)\$"); my @clientfixes= sort grep { m/./ } split /\s+/, $clientfixes; @@ -79,7 +79,7 @@ foreach my $bug (@$clientinfo) { unless grep { $_ eq $bug } @clientfixes; } -my $cversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); +my $clientversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); my $ocean= must_param('ocean', $re_any); my $island= must_param('island', $re_any); @@ -96,25 +96,49 @@ foreach my $islands (values %$arches) { } fail("unknown island") unless $island_found; +my $timestamp= must_param('timestamp', "^([1-9]\\d{1,20})\$"); +my $now= time; defined $now or die $!; +fail("clock skew") if $timestamp >= $now; + die if $ocean =~ m/\=/; die if $island =~ m/\=/; -$datafile= must_param('data',"^(deduped\\.tsv\\.gz)\$"); -$indatafh= upload('data'); fail("data is not a file") unless defined $datafh; +my $indatafh= upload('data'); +defined $indatafh or fail("data is not a file"); +my $datafile= must_param('data',"^(deduped\\.tsv\\.gz)\$"); our %done; -my $content= MIME::Entity->build(Type => 'multipart/mixed', - Boundary => '=', - Charset => 'utf-8'); +my $mcontent= MIME::Entity->build(To => 'yarrg-commod-updates', + Type => 'multipart/mixed', + Boundary => '=', + Charset => 'utf-8'); + +our ($servername,$serverversion,$serverfixes); +get_our_version('::server'); my $clientspec= "$clientname $clientversion $clientfixes"; -foreach $vn (qw(ocean island - clientspec - clientname clientversion clientfixes)) { +my $serverspec= "$servername $serverversion $serverfixes"; + +foreach my $vn (qw(ocean island timestamp + clientspec clientname clientversion clientfixes + serverspec servername serverversion serverfixes)) { + my $mpart= MIME::Entity->build(Type => 'text/plain', + Charset => 'utf-8', + Disposition => 'inline', + Data => $$vn); + $mcontent->add_part($mpart); +} -while (<$datafh>) { +my $gunzchild= open(GZ, "-|") or die $!; +if (!$gunzchild) { + open STDIN, "<&=", $indatafh or die $!; + execlp 'gunzip'; die $!; +} + +while () { !m/\P{IsPrint}/ or die bad_data('nonprinting char(s)'); + !m/\\/ or bad_data('data contains backslashes'); my @v= split /\t/; @v==6 or bad_data('wrong number of fields'); my ($commod,$stall) = @v; @@ -122,17 +146,24 @@ while (<$datafh>) { $stall =~ m/^\p{IsUpper}/ or bad_data("stall not capitalised"); !exists $done{$commod,$stall} or bad_data("repeated data"); $done{$commod,$stall}= 1; - foreach my $f (@v[2..5]) { + foreach my $i (2..5) { + my $f= $v[$i]; $f =~ m/^(0|[1-9][0-9]{0,5}|\>1000)$/ or bad_data("bad field"); - ($v % 1) or ($v !~ m/\>/) or bad_data("> in price"); + ($i % 1) or ($f !~ m/\>/) or bad_data("> in price"); } } +GZ->error and die $!; +$?=0; close GZ; $? and fail("gunzip for check failed code $?"); +my $mdatafile= MIME::Entity->build(Type => 'application/octet-streak', + Disposition => 'attachment', + Encoding => 'base64', + File => $datafile); +$mcontent->add_part($mdatafile); +open M, "|/usr/sbin/sendmail -t -oi -oee -odq" + or fail("fork sendmail failed! ($!)"); +$mcontent->print(\*M); - -#foreach my $commod (sort keys %commods) { -# print "$commod\n"; -#} -#STDOUT->error and die $!; -#close STDOUT or die $!; +M->error and fail("write sendmail failed! ($!)"); +$?=0; close M; $? and fail("sendmail failed code $?");