#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

use strict;

my $gNoLogDb = "nolog.db";

my %FORM;
ParseFormData(\%FORM);

my $language = TextToHtml($FORM{'language'});
my $winsize = TextToHtml($FORM{'winsize'});
my $userAgent = TextToHtml($FORM{'userAgent'});

my $result = 'ERROR';

if ($language ne '' && $winsize ne '' && $userAgent ne '')
{
	if (! -f $gNoLogDb)
	{
		open(DB, ">>$gNoLogDb");
		close(DB);
	}

	if (open(NOLOG_DB, "+<$gNoLogDb"))
	{
		my $LineNew = "$language|$winsize|$userAgent\n";
		my @Lines = <NOLOG_DB>;
		my @LinesNew = ();
		for my $Line (@Lines)
		{
			if($Line ne $LineNew)
			{
				push @LinesNew, $Line;
			}
		}
		push @LinesNew, $LineNew;
		seek(NOLOG_DB, 0, 0);
		truncate(NOLOG_DB, 0);
		print NOLOG_DB @LinesNew;
		close(NOLOG_DB);
		$result = 'SUCCESS';
	}
}

print "Content-type: text/html; charset=utf-8\n\n$result";

exit 0;

##############
# Funktionen #
##############

#
# Überträgt die mittels "POST" an das Formular übergebenen Daten
# in den Hash, dessen Referenz der Funktion übergeben wird. Der
# Zugriff auf die Daten erfolgt dann mit $Hashname{'Feldname'}.
#
sub ParseFormData
{
	my $FormHashRef = shift;

	my $formdata;

	read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});

	my @pairs = split(/&/, $formdata);

	for my $pair (@pairs)
	{
		my ($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/meg;
		${$FormHashRef}{$name} = $value;
	}
}

#
# Hilfsfunktion zum Maskieren aller HTML-(&, ", <, >) und DB-(Satztrenner, Feldtrenner)
# eigenen Zeichen, damit diese nicht vom Browser bzw. vom Script "interpretiert" werden,
# sondern als diese Zeichen dargestellt werden. Mit dieser Funktion sollten alle
# Textstrings, die in die DB geschrieben werden, zuvor in HTML konvertiert werden.
# Später nach dem Laden aus der DB können die Strings dann unmittelbar auf einer
# HTML-Seite angezeigt werden, ohne daß sie zuvor erneut konvertiert werden müssen.
#
sub TextToHtml
{
	my $text = shift;

	$text =~ s/\&/&amp;/g;
	$text =~ s/\"/&quot;/g;
	$text =~ s/\</&lt;/g;
	$text =~ s/\>/&gt;/g;

	$text =~ s/\r\n/<br>/g;
	$text =~ s/\r/<br>/g;
	$text =~ s/\n/<br>/g;

	$text =~ s/\|/&#124;/g;		# Feldtrenner für DB-Dateien

	$text;
}

