14 print "Content-type: text/plain\n\nd0er $err";
20 my ($goodpatterns, $badpatterns, $list) = @_;
22 my $name = $ENV{REMOTE_HOST} . ".";
23 my $addr = $ENV{REMOTE_ADDR};
29 if $name =~ /^(??{$_})$/ || $addr =~ /^(??{$_})$/;
35 if $name =~ /^(??{$_})$/ || $addr =~ /^(??{$_})$/;
39 my $h = gethostbyname $addr;
43 my $blprefix = join '.', reverse unpack 'C4', $h;
48 my $hn = "$blprefix.$_.";
49 my $h2 = gethostbyname $hn;
58 # create table ip ( id INT AUTO_INCREMENT PRIMARY KEY, ip VARCHAR(64), t DATETIME, error BOOLEAN, INDEX(ip), INDEX(t), INDEX(error) );
63 my ($dsn, $u, $p, $tbl, $inc) = @_;
64 my $ip = $ENV{REMOTE_ADDR};
65 my $DBH = ($__CACHED_DBH__ ? $__CACHED_DBH__ : ($__CACHED_DBH__ = DBI->connect($dsn, $u, $p, { RaiseError => 1, AutoCommit => 0 })))
67 $DBH->do("set character set utf8");
68 $DBH->do("set names utf8");
71 $DBH->do("update $tbl set error=true where ip=?", undef, $ip);
78 my $status = $DBH->selectrow_arrayref("select count(*) from $tbl where ip=? and error=false and t>date_sub(now(), interval 7 day)", undef, $ip)
81 return $status->[0] ? -1 : 0;
85 my $status = $DBH->selectall_arrayref("select error, t>date_sub(now(), interval 7 day) from $tbl where ip=?", undef, $ip)
89 if($status->[0][0] || !$status->[0][1]) # error, or after interval
91 $DBH->do("update $tbl set error=false, t=now() where ip=?", undef, $ip);
104 $DBH->do("insert into $tbl(ip, error, t) values(?, false, now())", undef, $ip);
115 my $ip = $ENV{REMOTE_ADDR};
116 my @s = split /\n/, get $s;
120 return 1 if "$ip." =~ /^\Q$i\E\./;
130 if((my $key = $cgi->param('key')))
135 my $ca = $cgi->param('ca');
136 $ca = $default_ca if not defined $ca;
137 error "Invalid CA" if not defined $ca{$ca};
138 error "Not allowed" if not $ca{$ca}->{check}->(1);
142 $tempfh = File::Temp->new();
144 my $fh = $cgi->upload('key');
148 print $tempfh $_ for <$fh>;
153 $key = decode_base64($key);
158 $ENV{REQUESTFILE} = $tempfh->filename;
159 $ENV{RESPONSEFILE} = $tempfh->filename;
160 $ENV{SECRET} = "key_$ca.d0sk";
161 open my $errfh, '-|', './crypto-keygen-standalone -P "$SECRET" -j "$REQUESTFILE" -o "$RESPONSEFILE" 2>&1'
162 or die "cannot start crypto-keygen-standalone";
165 or die "xonotic-keygen failed: $err";
170 $ca{$ca}->{check}->(-1);
174 print "Content-type: application/octet-stream\n\n";
181 Content-type: text/html
186 <title>Xonotic keygen</title>
189 <h1>Xonotic keygen</h1>
190 <form action="response.d0ir" method="post" enctype="multipart/form-data">
191 To generate and sign a key IN GAME, follow these steps on the console:
193 <li>crypto_keygen $default_ca http://rm.endoftheinternet.org/~xonotic/keygen/?ca=$default_ca&key=</li>
195 To generate and sign a key MANUALLY, follow these steps on a UNIX command line:
197 <li>./xonotic-keygen -p key_$default_ca.d0pk -o key_$default_ca.d0si</li>
198 <li>./xonotic-keygen -p key_$default_ca.d0pk -I key_$default_ca.d0si -o request.d0iq -O camouflage.d0ic
199 <li>Upload the request.d0iq file: <input type="file" name="key"><input type="submit"></li>
200 <li>Save the response.d0ir file you are getting</li>
201 <li>./xonotic-keygen -p key_$default_ca.d0pk -I key_$default_ca.d0si -c camouflage.d0ic -J response.d0ir -o key_$default_ca.d0si</li>
202 <li>Delete request.d0iq, camouflage.d0ic, response.d0ir</li>
204 Your key_$default_ca.d0si key is now signed.
206 To use another CA, please enter its number here before using this page:
207 <input type="text" name="ca" value="$default_ca" size="2">