#!/usr/bin/perl
use warnings;
use strict;
use constant {
MAX_NICK_LENGTH => 20,
MAX_MSG_LENGTH => 200,
KLASSE11TK_HOME => "http://m19s28.vlinux.de/iblech/klasse11/",
STAMPFILE => "/tmp/klasse11-relay.stamp",
DELAY => 8,
};
sub sendmsg($$);
use CGI;
use CGI::Carp "fatalsToBrowser";
use File::Touch;
my $q = CGI->new;
my $user = $q->param("username");
my $msg = $q->param("message");
my $last = (stat STAMPFILE)[9] || 0;
if(
defined $user and
defined $msg and
length($user) <= MAX_NICK_LENGTH and
length($msg) <= MAX_MSG_LENGTH and
$user =~ /^[\w@|\\\/^+\-*.,;:]+$/ and
$msg =~ /^[\x20-\xff]+$/ and
time - $last > DELAY
) {
sendmsg $user => $msg;
touch STAMPFILE or die "touch(STAMPFILE) schlug fehl: $!\n";
}
my $redir = $q->param("redirect") || $q->referer || KLASSE11TK_HOME;
print $q->redirect($redir),
$q->start_html("Moved"),
$q->p("<a href=\"" . qh($redir) . "\">Hier geht's weiter...</a>"),
$q->end_html;
exit;
sub sendmsg($$) {
my ($user, $msg) = @_;
open my $fh, "|-", "/home/heinz/heinzbot/relay",
"--fifo=/tmp/klasse11-relay.fifo",
"--log=/tmp/klasse11-relay.log" or
die "Konnte nicht relay starten: $!\n";
print $fh "[[$user]] $msg\n";
close $fh;
}
sub qh {
my $str = shift;
my %subst = (
'&' => "&",
'<' => "<",
'>' => ">",
'"' => """,
# http://www.w3.org/TR/xhtml1/#C_13
# The named character reference ' (the apostrophe, U+0027) was
# introduced in XML 1.0 but does not appear in HTML. Authors should therefore
# use ' instead of ' to work as expected in HTML 4 user agents.
"'" => "'",
);
my $new = "";
while(length $str) {
my $char = substr $str, 0, 1, "";
$new .= defined $subst{$char} ? $subst{$char} : $char;
}
return $new;
}
Download