#!/usr/bin/perl -w # # This script is invoked when the YPP SC PCTB client uploads to # the chiark database. # This is part of ypp-sc-tools, a set of third-party tools for assisting # players of Yohoho Puzzle Pirates. # # Copyright (C) 2009 Ian Jackson # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Yohoho and Puzzle Pirates are probably trademarks of Three Rings and # are used without permission. This program is not endorsed or # sponsored by Three Rings. # Uploads contain: # ocean canonical mixed case # island canonical mixed case # clientname "ypp-sc-tools" # clientversion 2.1-g2e06a26 [from git-describe --tags HEAD] # clientfixes "lastpage" [space separated list] # deduped.tsv.gz output of ypp-commodities --tsv use strict (qw(vars)); use POSIX; use Commods; $CGI::POST_MAX= 3*1024*1024; $CGI::DISABLE_UPLOADS= 1; use CGI qw/:standard -private_tempfiles/; setlocale(LC_CTYPE, "en_GB.UTF-8"); my $re_any= "^(.*)\$"; parse_masters(); sub fail ($) { my ($msg) = @_; print header(-status=>'400 Bad commodity update', -type=>'text/plain', -charset=>'us-ascii'); print "Error: $msg\n"; exit 0; } 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/; return $1; } my $clientname= must_param('clientname',$re_any); my $client= $clients{$clientname}; fail('unknown client') unless defined $client; my $clientfixes= must_param('clientfixes', $re_any); foreach my $bug (@$client) { fail("client out of date - missing bugfix \`$bug'") unless grep { $_ eq $bug } split /\s+/, $clientfixes; } my $cversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); my $ocean= must_param('ocean', $re_any); my $island= must_param('island', $re_any); my $arches= $oceans{$ocean}; fail("unknown ocean") unless $arches; my $island_found= 0; foreach my $islands (values %$arches) { my $sources= $islands->{$island}; next unless $sources; die if $island_found; $island_found= $sources; } fail("unknown island") unless $island_found; #foreach my $commod (sort keys %commods) { # print "$commod\n"; #} #STDOUT->error and die $!; #close STDOUT or die $!;