package BlogEntry; use strict; use BBCode; use LWP::Simple; use HTML::Entities; use URI::Escape; use Encode; our $Error_str = ''; my %fieldset = ( "SID" => 'Session-ID', "MID" => 'Message-ID', "AUTHOR" => 'Autor', "EMAIL" => 'E-Mail', "URL" => 'Homepage', "MSG" => 'Kommentar', "DATE" => 'Datum' ); my %commands = ( "SID" => \&_check_RE, "MID" => \&_check_RE, "AUTHOR" => \&_parse_UTF8, "EMAIL" => \&_validate_Email, "URL" => \&_validate_URL, "MSG" => \&_parse_msg, "DATE" => \&_check_RE, ); my %RE = ( "SID" => '[a-zA-Z0-9-_]{16}', "MID" => '\d{5}', "AUTHOR" => '[a-zA-ZäöüÄÖÜß,.;:_!"§ -]+', "DATE" => '\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}' ); my %exceptions; @exceptions{"submit", "preview"} = (); # Objektkonstruktor sub new { my $Objekt = shift; my $Referenz = {}; bless($Referenz,$Objekt); $Referenz->_init(); return($Referenz); } # Neue Eigenschaften hinzufuegen sub add_properties { my $Objekt = shift; my %props = ( @_ ); while(my ($schl, $wert) = each(%props)) { if(exists($fieldset{$schl})) { if($schl eq 'EMAIL' || $schl eq 'URL') { if(length($wert) > 0) { $Objekt->{$schl} = $wert; } } else { $Objekt->{$schl} = $wert; } } } } # Eingaben pruefen sub parse_input { my @test; my $Objekt = shift; if(@_) { @test = @_ }; foreach(@test) { if( exists($fieldset{$_}) ) { my $ret = $commands{$_}->($_, $Objekt->{$_}); if (!$ret or $ret eq 'invalid') { $Error_str .= "Der für $fieldset{$_} ($Objekt->{$_}) eingetragene Wert ist ungültig.
"; } $Objekt->{$_} = $ret; } else { if( !exists($exceptions{$_}) ) { $Error_str .= "Das Objekt hat keine Eigenschaft $_.
" }; } } $Error_str ne '' ? return $Error_str : return undef; } # Eigenschaften vorbelegen sub _init { my $Objekt = shift; $Objekt->{SID} = ''; $Objekt->{MID} = ''; $Objekt->{AUTHOR} = ''; $Objekt->{EMAIL} = ''; $Objekt->{URL} = ''; $Objekt->{MSG} = ''; $Objekt->{DATE} = _get_datetime(); return $Objekt; } # Datum aufbereiten sub _get_datetime { my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); $Monat+=1; $Jahrestag+=1; $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat; $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag; $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden; $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten; $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden; $Jahr+=1900; return "$Jahr-$Monat-$Monatstag $Stunden:$Minuten:$Sekunden"; } # RegExp-Pruefung sub _check_RE { my $feld = shift; my $str = shift; $str =~ /^$RE{$feld}$/ ? return $str : return undef; } # E-Mail Validierung sub _validate_Email { my $feld = shift; my $check = shift; if($check ne 'none' && $check ne '') { my $nonascii = "\x80-\xff"; my $nqtext = "[^\\\\$nonascii\015\012\"]"; my $qchar = "\\\\[^$nonascii]"; my $protocol = '(?:mailto:)'; my $normuser = '[a-zA-Z0-9][a-zA-Z0-9_.-]*'; my $quotedstring = "\"(?:$nqtext|$qchar)+\""; my $user_part = "(?:$normuser|$quotedstring)"; my $dom_mainpart = '[a-zA-Z0-9][a-zA-Z0-9._-]*\\.'; my $dom_subpart = '(?:[a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*'; my $dom_tldpart = '[a-zA-Z]{2,5}'; my $domain_part = "$dom_subpart$dom_mainpart$dom_tldpart"; my $regex = "$protocol?$user_part\@$domain_part"; $check =~ /^$regex$/ ? return $check : return 'invalid'; } else { return 'none'; } } # URL-Validierung sub _validate_URL { my $feld = shift; my $uri = shift; if($uri ne 'none' && $uri ne '') { my $success = get($uri); defined $success ? return $uri : return 'invalid'; } else { return 'none'; } } # BBCode in Message parsen sub _parse_msg { my $feld = shift; my $old = shift; my $msg = _parse_UTF8(0,$old); my @bbcode_tags = qw(b u i url img); my $bbc = HTML::BBCode->new( { allowed_tags => [ @bbcode_tags ], no_html => 1, linebreaks => 1 } ); my $html = $bbc->parse($msg); $html =~ s!(")!"!g; $html =~ s!(')!'!g; return $html; } sub _parse_UTF8 { my $mode = shift; my $str = shift; return encode_entities(decode_utf8(uri_unescape($str))); } 1;