#!/usr/bin/perl # # Kerndatei des EBNewsLetters # # -------------------- [Copyright Informationen] -------------------- # # Titel: EBNewsLetter # Version: 1.1 # Datum: 17.07.2004, 23.59 Uhr # Autor: Erik Bertram # eMail: webmaster@cgi-world.de # # Beschreibung: Software zum Versenden von Newslettern. # # Copyright: Copyright (c) by Erik Bertram, 2004 # Alle Rechte vorbehalten. All Rights Reserved. # # Kontakt: Erik Bertram # Schopenhauerstraße 1a # D-55606 Kirn # # Homepage: # http://www.cgi-world.de # # -------------------- [Lizenzbedingungen] -------------------- # # (1) Diese Lizenz erlaubt es Ihnen, die Software EBNewsLetter zu nutzen. # (2) Als Nutzer der Software können Sie diese auf eigenes Risiko # Ihren ganz persönlichen Wünschen anpassen. # (3) Der Benutzer trägt die Haftung beim Benutzen der Software. Erik Bertram # haftet nicht für eventuelle Schäden oder Sicherheitsrisikos durch das # Programm. # (4) Die Weitergabe der Software an Dritte ist erlaubt! Dies darf # dann aber nur geschehen, wenn die Software im Originalzustand # vorhanden ist. Die Weitergabe angepasster oder veränderter # Versionen ist untersagt. # (5) In der Software muss das jeweilige Copyright (c) in dem Script # sowie am Ende jeder Seite vorhanden sein. Eine Veränderung # des Copyrights ist nicht gestattet. # (6) Die Software darf weder im Ganzen noch im Teil verkauft, vermietet oder # verleast werden. Sie ist als Freeware online erhältlich. # (7) Der Betreiber verpflichtet sich während der Nutzung der Software # diese Lizenz weiter zu erhalten. # (8) Die Dateien werden ohne Funktions- oder Sicherheitsgarantie zum # Download angeboten. Erstattungen sind nicht möglich. # (9) Bei einem Verstoß gegen die Lizenz kann diese dem Betreiber # jederzeit durch Erik Bertram entzogen und so die Nutzung der # Software untersagt werden. # (10) Diese Lizenz ist unbegrenzt lang nutzbar und auch für neuere # Versionen gültig. # (11) Diese Lizenz richtet sich an das GPL/GNU Lizenzabkommen. # (12) Durch Nutzung der Software erklären Sie sich mit dem # Lizenzabkommen einverstanden. # # Stand: 02.03.2003 # # -------------------- [Systemanforderungen] -------------------- # # Perl ab Version 5 # Betriebssystem: Unix/Linux, FreeBSD, OpenBSD oder Windows # 615 KB freier Webspace # "cgi-bin" Verzeichnis zum Ausführen des Programms # Sendmail # Optional: Modul "Net::SMTP_auth", falls Sendmail nicht vorhanden # Optional: Module "CGI.pm", "warnings.pm" und "diagnostics.pm" # # Konfigurationsdatei einbinden BEGIN { if(-e("data/config.txt")){ require("data/config.txt"); }else{ print "Content-type: text/html\n\n"; print "Achtung: EBNewsLetter kann nicht ausgeführt werden, da folgende Datei fehlt:
"; print "----------
"; print "'data/config.txt'
"; print "----------
"; print "Stellen Sie sicher, dass die aufgeführte Datei zur Verfügung steht!"; exit; } if($howtosendemail == "1"){ eval { require Net::SMTP_auth; }; if($@){ $netsmtp = "0"; }else{ $netsmtp = "1"; require Net::SMTP_auth; } } } # Script nach 180 Sekunden Laufzeit abbrechen $SIG{ALRM} = sub { print "Content-type: text/html\n\nAchtung: Script wurde aufgrund zu langer Laufzeit beendet!"; exit; }; alarm(180); # Module zum Debuggen einbinden use CGI::Carp qw(fatalsToBrowser); # use strict; # use warnings; # use diagnostics; # Version $version = "1.1"; # Daten über STDIN einlesen $| = "1"; binmode(STDIN); read(STDIN, $input, $ENV{'CONTENT_LENGTH'}); if($ENV{'CONTENT_TYPE'} =~ /^(.+)boundary=(.+)$/){ $boundary = '--'.$2; @pairs = split(/$boundary/, $input); }else{ @pairs = split(/&/, $input); } $browser = $ENV{HTTP_USER_AGENT}; if($browser=~/vms/i) { $x = "\n"; }elsif($browser =~/^MacOS$/i) { $x = "\n\r"; }else{ $x = "\015\012"; } foreach $i (@pairs){ if($boundary){ ($header,$content) = split(/$x$x/,$i,2); ($name) = ($header =~ / name="([^"]*?)"/s); }else{ ($name,$content) = split(/=/, $i,2); } if($content ne ""){ if($header =~ /filename/s && $boundary ne "" && $name =~ /^uploaddata[\d]+$/i){ ($filename) = ($header =~ /; filename="([^"]*?)"/s); while ($filename =~ /\\/) { $filename =~ s/^.*\\//; } ($mimetype) = ($header =~ /Content-Type: (.*)/s); $mimetype =~ s/($x.*)//s; if($filename){ $content =~ s/^$x//gs; $content =~ s/$x$//gs; $FORM{$name} = $content; $FILE{$name} = $filename; $MIME{$name} = $mimetype; } }else{ $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $content =~ tr/+/ /; $content =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $content =~ s/$x/\n/g; chomp($content); if($FORM{$name}){ $FORM{$name} .= ",$content"; }else{ $FORM{$name} = $content; } } } } foreach $i (split(/&/,$ENV{QUERY_STRING})){ ($v, $c) = split(/=/,$i,2); $v =~ tr/+/ /; $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $c =~ s/\#\w+$//; $c =~ tr/+/ /; $c =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $c =~ s///g; if($INFO{$v}){ $INFO{$v} .= ",$c"; }else{ $INFO{$v} = $c; } } if($INFO{'action'} ne ""){ $action = $INFO{'action'}; }else{ $action = $FORM{'action'}; } # Biblitheks-Funktion aufrufen &library; # Weiterleiten if($action =~ /index/){ &index; exit; } elsif($action =~ /checksubscription/){ &checksubscription; exit; } elsif($action =~ /unsubscribe/){ &userunsubscribe; exit; } elsif($action =~ /subscribe/){ &subscribe; exit; } elsif($action =~ /userconfirmmail/){ &userconfirmmail; exit; } elsif($action =~ /admin/){ &admin; exit; } else{ &index; } # Bibliotheks-Funktion sub library { $x = "0"; open(F, "data/speech.txt") || die ¬eerror('Kann Datei nicht zum Lesen öffnen:', 'data/speech.txt', $!); flock(F,2) if($flock); foreach $i (){ chomp($i); $speech{$x} = $i; $x++; } flock(F,8) if($flock); close(F); if($gmt == "0"){ $TimeGMT = time(); }elsif($gmt =~ m/^\-/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = time() - ($gmt2 * 3600); }elsif($gmt =~ m/^\+/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = time() + ($gmt2 * 3600); } ($sec, $min, $hours, $day, $month, $year, $wday, $yday, $isdst) = localtime($TimeGMT); $month += 1; $year += 1900; $min = "0$min" if($min < "10"); $sec = "0$sec" if($sec < "10"); $hours = "0$hours" if($hours < "10"); $day = "0$day" if($day < "10"); $month = "0$month" if($month < "10"); if($eurodatum == "0"){ $zeit = "$day.$month.$year"; $zeit2 = "$day.$month.$year"; $zeit .= ", $hours:$min:$sec"; }else{ $zeit = "$month/$day/$year"; $zeit2 = "$month/$day/$year"; $zeit .= ", $hours:$min:$sec"; } if($ENV{'HTTP_X_FORWARDED_FOR'} ne ""){ $ip = $ENV{'HTTP_X_FORWARDED_FOR'}; }else{ $ip = $ENV{'REMOTE_ADDR'}; } if($howtosendemail == "0"){ @mailprog = ($mailprog,"/bin/sendmail","/sbin/sendmail","/usr/lib/sendmail","/usr/bin/sendmail","/usr/share/sendmail","/usr/sbin/sendmail","/usr/src/sendmail","/etc/sendmail","/bin/sendmail"); foreach $i (@mailprog){ if(-e("$i") && -X("$i")){ $availablemailprog = $i; last; } } } $email =~ s/; |;/,/; $pemail = (split(/,|, /, $email))[0]; } # Index ausgeben sub index { open(F, "templates/ebnewsletter.htm") || die ¬eerror($speech{'0'}, 'templates/ebnewsletter.htm', $!); flock(F,2) if($flock); $index = join("",); flock(F,8) if($flock); close(F); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ip, $opt) = split(/\|/, $i); $allabos++ if($opt == "0"); $allus++ if($opt == "1"); $abotoday++ if(($time + 86400) > time()); $aboyesterday++ if($time < (time() - 86400) && $time > (time() - 172800)); } open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); $allabos ||= "0"; $allus ||= "0"; $abotoday ||= "0"; $aboyesterday ||= "0"; $allsend = scalar(@archiv); $index =~ s/<_CGI>/$cgi/gi; $index =~ s/<_GRAFIK>/$graphics/gi; $index =~ s/<_ALLABOS>/$allabos/gi; $index =~ s/<_ABOTODAY>/$abotoday/gi; $index =~ s/<_ABOYES>/$aboyesterday/gi; $index =~ s/<_ALLUS>/$allus/gi; $index =~ s/<_ALLSEND>/$allsend/gi; $index =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &header; print $index; &footer; exit; } # Prüfen, ob E-Mail bereits eingetragen ist sub checksubscription { open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } $x = 0; foreach $i (@emails){ chomp($i); ($mail, $time, $ip, $opt) = split(/\|/, $i); $x = 1 if($mail eq $INFO{'email'}) } $msg = ($x) ? $speech{'3'} : $speech{'4'}; open(F, "templates/showstatus.htm") || die ¬eerror($speech{'0'}, 'templates/showstatus.htm', $!); flock(F,2) if($flock); $status = join("",); flock(F,8) if($flock); close(F); $INFO{'email'} =~ s/<|>|"//gi; $status =~ s/<_CGI>/$cgi/gi; $status =~ s/<_GRAFIK>/$graphics/gi; $status =~ s/<_STATUS>/$msg/gi; $status =~ s/<_EMAIL>/$INFO{'email'}/gi; $status =~ s/<_V>/$version/gi; $status =~ s/<_OPT>/$x/gi; print "Content-type: text/html\n\n"; print $status; exit; } # Prüfen, ob E-Mail korrekt ist sub validateemail { $mail = shift; @letters = qw(E1 E0 103 E2 E5 E4 E3 105 101 E6 107 109 10D 10B E7 10F 111 E9 E8 115 EA 11B EB 117 119 113 11F 11D 121 123 125 127 ED EC 12D EE EF 129 12F 12B 131 135 137 13A 13E 13C 142 144 148 F1 146 14B F3 F2 14F F4 F6 151 F5 F8 14D 153 138 155 159 157 15B 15D 161 15F 165 163 167 FA F9 16D FB 16F FC 171 169 173 16B 175 FD 177 FF 17A 17E 17C F0 FE 2D 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A); $mail =~ m/^(.*?)\@(.*?)\.\w+/; $name = $1; $provider = $2; if($mail =~ /^.*?\@.*?\-\.\w+$/g){ &error($speech{'5'}); } if(length($provider) < "3"){ &error($speech{'5'}); } if(length($provider) > "63"){ &error($speech{'5'}); } foreach $i (split(//, $mail)){ $i = unpack("H*", $i); $x = "0"; foreach $a (@lettersnew){ $a = lc($a); $x++ if($i ne $a); } if($x == @lettersnew){ return 0; last; } } return 1; } # In Liste eintragen sub subscribe { &error($speech{'2'}) if($FORM{'email'} eq ""); &error($speech{'5'}) if(&validateemail($FORM{'email'})); if($ban == "0"){ open(F, "data/ban.txt") || die ¬eerror($speech{'0'}, 'data/ban.txt', $!); flock(F,2) if($flock); @ban = ; flock(F,8) if($flock); close(F); foreach $i (@ban){ chomp($i); if($i =~ m/\*/){ if(length($i) == length($FORM{'email'})){ @email = split(//, $i); @email2 = split(//, $FORM{'email'}); $y = "0"; foreach $a (@email){ $z++ if($a eq $email2[$y] || $a eq "*"); $y++; } &error($speech{'6'}) if($z == length($FORM{'email'})); $z = "0"; } }else{ &error($speech{'6'}) if($i eq $FORM{'email'}); } } $x = "0" if($z != @ignoreall); } if($floodcookies == "1"){ open(F, "data/flood.txt") || die ¬eerror($speech{'0'}, 'data/flood.txt', $!); flock(F,2) if($flock); @flood = ; flock(F,8) if($flock); close(F); foreach $i (@flood){ chomp($i); ($when, $num) = split(/\|/, $i); &error($speech{'20'}) if(($num eq $ip && $when >= time()) && $flooding == "0"); } }else{ foreach $i (split(/; /, $ENV{'HTTP_COOKIE'})){ ($c, $v) = split(/=/, $i); $cookieflood = $v if($c eq "flood"); } &error($speech{'20'}) if(time() <= $cookieflood); } if($FORM{'option'} eq "0"){ open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); &error($speech{'3'}) if($mail eq $FORM{'email'} && $opt == "0"); &error($speech{'7'}) if($mail eq $FORM{'email'} && $opt == "2"); &error($speech{'8'}) if($mail eq $FORM{'email'} && $opt == "3"); $y = "0" if($mail eq $FORM{'email'} && $opt == "1"); } if($confirmadminmail == "0"){ $adminopt = "3"; }elsif($confirmuser == "0"){ $adminopt = "2"; }else{ $adminopt = "0"; } $time = time(); if($y eq "0"){ foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); if($mail eq $FORM{'email'}){ $newemails .= "$mail\|$time\|$ip\|$adminopt\n"; }else{ $newemails .= "$i\n"; } } }else{ map{$newemails .= "$_\n"} @emails; $newemails .= "$FORM{'email'}\|$time\|$ip\|$adminopt\n"; } open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); if($confirmadminmail == "0"){ open(F, "data/confirmadminmail.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminmail.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $usermail = unpack("H*", $FORM{'email'}); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; $confirmmail =~ s/<_IP>/$ip/gi; $confirmmail =~ s/<_UA>/$ENV{'HTTP_USER_AGENT'}/gi; $confirmmail =~ s/<_TIME>/$time/gi; $confirmmail =~ s/<_RP>/$ENV{'REMOTE_PORT'}/gi; $confirmmail =~ s/<_AL>/$ENV{'HTTP_ACCEPT_LANGUAGE'}/gi; $confirmmail =~ s/<_MT>/$ENV{'HTTP_ACCEPT'}/gi; $confirmmail =~ s/<_ZS>/$ENV{'HTTP_ACCEPT_CHARSET'}/gi; $confirmmail =~ s/<_CM>/$ENV{'HTTP_ACCEPT_ENCODING'}/gi; $confirmmail =~ s/<_ADMIN>/$cgi\/ebnewsletter\.cgi\?action=admin&do=login/gi; $confirmmail =~ s/<_FREE>/$cgi\/ebnewsletter\.cgi\?action=admin&do=confirmmail&email=$usermail&pass=$adminpassword/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($email, $confirmmail); }else{ if($netsmtp){ $absender = join("|", split(/, |,/, $email)); &netsmtp($absender, $confirmmail); }else{ &error($speech{'12'}); } } if($confirmuserin == "0"){ open(F, "data/confirmadminuser.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminuser.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($FORM{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($FORM{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } } }elsif($confirmuser == "0"){ open(F, "data/confirmuser.txt") || die ¬eerror($speech{'0'}, 'data/confirmuser.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $usermail = unpack("H*", $FORM{'email'}); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; $confirmmail =~ s/<_FREE>/$cgi\/ebnewsletter\.cgi\?action=userconfirmmail&email=$usermail/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($FORM{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($FORM{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } }else{ if($confirmuserin == "0"){ open(F, "data/confirmuserin.txt") || die ¬eerror($speech{'0'}, 'data/confirmuserin.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($FORM{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($FORM{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } } if($confirmadminin == "0"){ open(F, "data/confirmadminin.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminin.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; $confirmmail =~ s/<_IP>/$ip/gi; $confirmmail =~ s/<_UA>/$ENV{'HTTP_USER_AGENT'}/gi; $confirmmail =~ s/<_TIME>/$time/gi; $confirmmail =~ s/<_RP>/$ENV{'REMOTE_PORT'}/gi; $confirmmail =~ s/<_AL>/$ENV{'HTTP_ACCEPT_LANGUAGE'}/gi; $confirmmail =~ s/<_MT>/$ENV{'HTTP_ACCEPT'}/gi; $confirmmail =~ s/<_ZS>/$ENV{'HTTP_ACCEPT_CHARSET'}/gi; $confirmmail =~ s/<_CM>/$ENV{'HTTP_ACCEPT_ENCODING'}/gi; $confirmmail =~ s/<_ADMIN>/$cgi\/ebnewsletter\.cgi\?action=admin&do=login/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($email, $confirmmail); }else{ if($netsmtp){ $absender = join("|", split(/, |,/, $email)); &netsmtp($absender, $confirmmail); }else{ &error($speech{'12'}); } } } } }else{ open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); &error($speech{'9'}) if($mail eq $FORM{'email'} && $opt == "1"); $y++ if($mail ne $FORM{'email'}); } &error($speech{'4'}) if($y == scalar(@emails)); $time = time(); foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); if($mail eq $FORM{'email'} && $confirmmailuserout == "1"){ $newemails .= "$mail\|$time\|$ip\|1\n"; }else{ $newemails .= "$i\n"; } } open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); if($confirmmailuserout == "0"){ open(F, "data/confirmusermail.txt") || die ¬eerror($speech{'0'}, 'data/confirmusermail.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $usermail = unpack("H*", $FORM{'email'}); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; $confirmmail =~ s/<_OUT>/$cgi\/ebnewsletter\.cgi\?action=unsubscribe&email=$usermail/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($FORM{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($FORM{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } }else{ if($confirmadminout == "0"){ open(F, "data/confirmadminout.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminout.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; $confirmmail =~ s/<_IP>/$ip/gi; $confirmmail =~ s/<_UA>/$ENV{'HTTP_USER_AGENT'}/gi; $confirmmail =~ s/<_TIME>/$time/gi; $confirmmail =~ s/<_RP>/$ENV{'REMOTE_PORT'}/gi; $confirmmail =~ s/<_AL>/$ENV{'HTTP_ACCEPT_LANGUAGE'}/gi; $confirmmail =~ s/<_MT>/$ENV{'HTTP_ACCEPT'}/gi; $confirmmail =~ s/<_ZS>/$ENV{'HTTP_ACCEPT_CHARSET'}/gi; $confirmmail =~ s/<_CM>/$ENV{'HTTP_ACCEPT_ENCODING'}/gi; $confirmmail =~ s/<_ADMIN>/$cgi\/ebnewsletter\.cgi\?action=admin&do=login/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($email, $confirmmail); }else{ if($netsmtp){ $absender = join("|", split(/, |,/, $email)); &netsmtp($absender, $confirmmail); }else{ &error($speech{'12'}); } } } if($confirmuserout == "0"){ open(F, "data/confirmuserout.txt") || die ¬eerror($speech{'0'}, 'data/confirmuserout.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$FORM{'email'}/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($FORM{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($FORM{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } } } } if($floodcookies == "1"){ open(F, "data/flood.txt") || die ¬eerror($speech{'0'}, 'data/flood.txt', $!); flock(F,2) if($flock); @flood = ; flock(F,8) if($flock); close(F); foreach $i (@flood){ chomp($i); ($when, $num) = split(/\|/, $i); if($when < time()){ next; }else{ $sperre .= "$i\n"; } } open(F, "> data/flood.txt") || die ¬eerror($speech{'2'}, 'data/flood.txt', $!); flock(F,2) if($flock); print F $sperre, (time() + $floodingtimeout), "\|$ip\n"; flock(F,8) if($flock); close(F); }else{ $sperre = time() + $floodingtimeout; print "Set-Cookie: flood=$sperre; expires=Mon, 1-Jan-2030 00:00:00 GMT;\n" } if($FORM{'option'} eq "0"){ if($confirmadminmail == "0"){ $msg = $speech{'15'}; }elsif($confirmuser == "0"){ $msg = $speech{'16'}; }else{ $msg = $speech{'17'}; } open(F, "templates/confirmationin.htm") || die ¬eerror($speech{'0'}, 'templates/confirmationin.htm', $!); flock(F,2) if($flock); $html = join("",); flock(F,8) if($flock); close(F); $html =~ s/<_CGI>/$cgi/gi; $html =~ s/<_GRAFIK>/$graphics/gi; $html =~ s/<_M>/$msg/gi; $html =~ s/<_V>/$version/gi; }else{ if($confirmmailuserout == "0"){ $msg = $speech{'18'}; }else{ $msg = $speech{'19'}; } open(F, "templates/confirmationout.htm") || die ¬eerror($speech{'0'}, 'templates/confirmationout.htm', $!); flock(F,2) if($flock); $html = join("",); flock(F,8) if($flock); close(F); $html =~ s/<_CGI>/$cgi/gi; $html =~ s/<_GRAFIK>/$graphics/gi; $html =~ s/<_M>/$msg/gi; $html =~ s/<_V>/$version/gi; } print "Content-type: text/html\n\n"; &header; print $html; &footer; exit; } # E-Mail über Sendmail versenden sub sendmail { ($to, $msg) = @_; $forwarder =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M "To: $to\n"; print M "From: $forwarder \n"; print M "X-Priority: 3 (Normal)\n"; print M "X-Mailer: EBNewsLetter $version\n"; if($ENV{'REMOTE_ADDR'}){ print M "X-IP: $ENV{'REMOTE_ADDR'}\n"; }else{ print M "X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"; } print M $msg; close(M); } # E-Mail über SMTP Server versenden sub netsmtp { ($to, $msg) = @_; @to = split(/\|/, $to); $forwarder =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or die ¬eerror($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); $smtp->recipient(@to); $smtp->data() or die ¬eerror($speech{'14'}, $mailhost, $!); $smtp->datasend("From: $forwarder \n"); $smtp->datasend("X-Priority: 3 (Normal)\n"); $smtp->datasend("X-Mailer: EBNewsLetter $version\n"); if($ENV{'REMOTE_ADDR'}){ $smtp->datasend("X-IP: $ENV{'REMOTE_ADDR'}\n"); }else{ $smtp->datasend("X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"); } $smtp->datasend($msg); $smtp->dataend(); $smtp->quit(); } # E-Mail Adresse bestätigen sub userconfirmmail { &error($speech{'21'}) if($INFO{'email'} eq ""); $INFO{'email'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &error($speech{'5'}) if(&validateemail($INFO{'email'})); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); &error($speech{'22'}) if($mail eq $INFO{'email'} && $opt == "0"); &error($speech{'4'}) if($mail eq $INFO{'email'} && $opt == "1"); &error($speech{'8'}) if($mail eq $INFO{'email'} && $opt == "3"); if($mail eq $INFO{'email'}){ $y = "1"; $newemails .= "$mail\|$time\|$ipold\|0\n"; }else{ $newemails .= "$i\n"; } } if($y != "1"){ &error($speech{'23'}); }else{ open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); } if($confirmadminin == "0"){ open(F, "data/confirmadminin.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminin.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$INFO{'email'}/gi; $confirmmail =~ s/<_IP>/$ip/gi; $confirmmail =~ s/<_UA>/$ENV{'HTTP_USER_AGENT'}/gi; $confirmmail =~ s/<_TIME>/$time/gi; $confirmmail =~ s/<_RP>/$ENV{'REMOTE_PORT'}/gi; $confirmmail =~ s/<_AL>/$ENV{'HTTP_ACCEPT_LANGUAGE'}/gi; $confirmmail =~ s/<_MT>/$ENV{'HTTP_ACCEPT'}/gi; $confirmmail =~ s/<_ZS>/$ENV{'HTTP_ACCEPT_CHARSET'}/gi; $confirmmail =~ s/<_CM>/$ENV{'HTTP_ACCEPT_ENCODING'}/gi; $confirmmail =~ s/<_ADMIN>/$cgi\/ebnewsletter\.cgi\?action=admin&do=login/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($email, $confirmmail); }else{ if($netsmtp){ $absender = join("|", split(/, |,/, $email)); &netsmtp($absender, $confirmmail); }else{ &error($speech{'12'}); } } } open(F, "templates/unlocked.htm") || die ¬eerror($speech{'0'}, 'templates/unlocked.htm', $!); flock(F,2) if($flock); $unlocked = join("",); flock(F,8) if($flock); close(F); $unlocked =~ s/<_CGI>/$cgi/gi; $unlocked =~ s/<_GRAFIK>/$graphics/gi; $unlocked =~ s/<_EMAIL>/$INFO{'email'}/gi; $unlocked =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &header; print $unlocked; &footer; exit; } # E-Mail Adresse löschen sub userunsubscribe { &error($speech{'21'}) if($INFO{'email'} eq ""); $INFO{'email'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &error($speech{'5'}) if(&validateemail($INFO{'email'})); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); &error($speech{'4'}) if($mail eq $INFO{'email'} && $opt == "1"); $y++ if($mail ne $INFO{'email'}); if($mail eq $INFO{'email'}){ $newemails .= "$mail\|$time\|$ipold\|1\n"; }else{ $newemails .= "$i\n"; } } if($y == scalar(@emails)){ &error($speech{'23'}); }else{ open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); } if($confirmadminout == "0"){ open(F, "data/confirmadminout.txt") || die ¬eerror($speech{'0'}, 'data/confirmadminout.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$INFO{'email'}/gi; $confirmmail =~ s/<_IP>/$ip/gi; $confirmmail =~ s/<_UA>/$ENV{'HTTP_USER_AGENT'}/gi; $confirmmail =~ s/<_TIME>/$time/gi; $confirmmail =~ s/<_RP>/$ENV{'REMOTE_PORT'}/gi; $confirmmail =~ s/<_AL>/$ENV{'HTTP_ACCEPT_LANGUAGE'}/gi; $confirmmail =~ s/<_MT>/$ENV{'HTTP_ACCEPT'}/gi; $confirmmail =~ s/<_ZS>/$ENV{'HTTP_ACCEPT_CHARSET'}/gi; $confirmmail =~ s/<_CM>/$ENV{'HTTP_ACCEPT_ENCODING'}/gi; $confirmmail =~ s/<_ADMIN>/$cgi\/ebnewsletter\.cgi\?action=admin&do=login/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($email, $confirmmail); }else{ if($netsmtp){ $absender = join("|", split(/, |,/, $email)); &netsmtp($absender, $confirmmail); }else{ &error($speech{'12'}); } } } open(F, "templates/deleted.htm") || die ¬eerror($speech{'0'}, 'templates/deleted.htm', $!); flock(F,2) if($flock); $deleted = join("",); flock(F,8) if($flock); close(F); $deleted =~ s/<_CGI>/$cgi/gi; $deleted =~ s/<_GRAFIK>/$graphics/gi; $deleted =~ s/<_EMAIL>/$INFO{'email'}/gi; $deleted =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &header; print $deleted; &footer; exit; } # Weiterleiten sub admin { if($INFO{'do'} eq "confirmmail"){ &adminconfirmmail; exit; } if($INFO{'do'} eq "login"){ &adminlogin; exit; } if($INFO{'do'} eq "showadmin"){ &adminshow; exit; } if($INFO{'do'} eq "newsletter"){ &adminshownewsletter; exit; } if($INFO{'do'} eq "smileys"){ &adminshowsmileys; exit; } if($INFO{'do'} eq "showsmileys"){ &adminshowallsmileys; exit; } if($INFO{'do'} eq "sendnewsletter"){ &adminsendnewsletter; exit; } if($INFO{'do'} eq "uploadfiles"){ &adminshowuploadfiles; exit; } if($INFO{'do'} eq "upload"){ &adminuploadfiles; exit; } if($INFO{'do'} eq "viewfile"){ &adminviewfile; exit; } if($INFO{'do'} eq "deletefiles"){ &admindeletefiles; exit; } if($INFO{'do'} eq "archiv"){ &adminshowarchiv; exit; } if($INFO{'do'} eq "sortfiles"){ &adminsortfiles; exit; } if($INFO{'do'} eq "sortnewsletter"){ &adminsortnewsletter; exit; } if($INFO{'do'} eq "deletearchiv"){ &admindeletearchiv; exit; } if($INFO{'do'} eq "viewnewsletter"){ &adminviewnewsletter; exit; } if($INFO{'do'} eq "logout"){ &adminlogout; exit; } if($INFO{'do'} eq "deletenewsletter"){ &admindeletenewsletter; exit; } if($INFO{'do'} eq "sendbackup"){ &adminsendnewsletterbackup; exit; } if($INFO{'do'} eq "viewheader"){ &adminviewheader; exit; } if($INFO{'do'} eq "shownewsletter"){ &adminprintnewsletter; exit; } if($INFO{'do'} eq "abos"){ &adminshowemails; exit; } if($INFO{'do'} eq "saveemails"){ &adminsaveemails; exit; } if($INFO{'do'} eq "sortemails"){ &adminsortemails; exit; } if($INFO{'do'} eq "statistik"){ &adminstatistik; exit; } if($INFO{'do'} eq "htmlcode"){ &adminhtmlcode; exit; } if($INFO{'do'} eq "showgeneratedcode"){ &adminshowgeneratedcode; exit; } if($INFO{'do'} eq "errors"){ &adminshowerrors; exit; } if($INFO{'do'} eq "saveerrors"){ &adminsaveerrors; exit; } if($INFO{'do'} eq "showlogfile"){ &adminshowlogfile; exit; } if($INFO{'do'} eq "savelogfile"){ &adminsavelogfile; exit; } if($INFO{'do'} eq "updatefiles"){ &adminupdatefiles; exit; } if($INFO{'do'} eq "saveupdatefiles"){ &adminsaveupdatefiles; exit; } if($INFO{'do'} eq "loadtemplate"){ &adminloadtemplate; exit; } if($INFO{'do'} eq "viewtemplate"){ &adminviewtemplate; exit; } if($INFO{'do'} eq "savetemplate"){ &adminsavetemplate; exit; } if($INFO{'do'} eq "loadspeech"){ &adminloadspeech; exit; } if($INFO{'do'} eq "savespeech"){ &adminsavespeech; exit; } if($INFO{'do'} eq "showconfigdes"){ &adminshowconfig; exit; } if($INFO{'do'} eq "backup"){ &adminbackup; exit; } if($INFO{'do'} eq "emailtest"){ &adminemailtest; exit; } if($INFO{'do'} eq "saveconfig"){ &adminsaveconfig; exit; } if($INFO{'do'} eq "importemails"){ &adminshowimportemails; exit; } if($INFO{'do'} eq "saveimportedmails"){ &adminsaveimportedmails; exit; } if($INFO{'do'} eq "uploadimportedmails"){ &adminuploadimportedmails; exit; } if($INFO{'do'} eq "exportemails"){ &adminshowexportmails; exit; } if($INFO{'do'} eq "downloademails"){ &admindownloadmails; exit; } } # Admin muss E-Mail freischalten sub adminconfirmmail { &error($speech{'21'}) if($INFO{'email'} eq ""); $INFO{'email'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &error($speech{'5'}) if(&validateemail($INFO{'email'})); &error($speech{'25'}) if($INFO{'pass'} ne $adminpassword); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($sortemails == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($sortemails == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($sortemails == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($sortemails == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } foreach $i (@emails){ chomp($i); ($mail, $time, $ipold, $opt) = split(/\|/, $i); &error($speech{'22'}) if($mail eq $INFO{'email'} && $opt == "0"); &error($speech{'4'}) if($mail eq $INFO{'email'} && $opt == "1"); &error($speech{'26'}) if($mail eq $INFO{'email'} && $opt == "2"); if($mail eq $INFO{'email'}){ $y = "1"; $newemails .= "$mail\|$time\|$ipold\|0\n"; }else{ $newemails .= "$i\n"; } } if($y != "1"){ &error($speech{'23'}); }else{ open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); } if($unlockedmailuser == "0"){ open(F, "data/confirmunlocked.txt") || die ¬eerror($speech{'0'}, 'data/confirmunlocked.txt', $!); flock(F,2) if($flock); $confirmmail = join("",); flock(F,8) if($flock); close(F); $confirmmail =~ s/<_EMAIL>/$INFO{'email'}/gi; if($howtosendemail == "0"){ &error($speech{'10'}) if($availablemailprog eq ""); &sendmail($INFO{'email'}, $confirmmail); }else{ if($netsmtp){ &netsmtp($INFO{'email'}, $confirmmail); }else{ &error($speech{'12'}); } } } open(F, "templates/unlocked.htm") || die ¬eerror($speech{'0'}, 'templates/unlocked.htm', $!); flock(F,2) if($flock); $unlocked = join("",); flock(F,8) if($flock); close(F); $unlocked =~ s/<_CGI>/$cgi/gi; $unlocked =~ s/<_GRAFIK>/$graphics/gi; $unlocked =~ s/<_EMAIL>/$INFO{'email'}/gi; $unlocked =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &header; print $unlocked; &footer; exit; } # In die Administration einloggen sub adminlogin { open(F, "templates/adminlogin.htm") || die ¬eerror($speech{'0'}, 'templates/adminlogin.htm', $!); flock(F,2) if($flock); $adminlogin = join("",); flock(F,8) if($flock); close(F); $adminlogin =~ s/<_CGI>/$cgi/gi; $adminlogin =~ s/<_GRAFIK>/$graphics/gi; $adminlogin =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &header; print $adminlogin; &footer; exit; } # Administration anzeigen sub adminshow { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/admingeneral.htm") || die ¬eerror($speech{'0'}, 'templates/admingeneral.htm', $!); flock(F,2) if($flock); $admin = join("",); flock(F,8) if($flock); close(F); foreach $i (split(/\, |\,/, $adminname)){ $i =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &encode($i); $realadminname .= "$i, "; } $realadminname =~ s/\, $//; $forwarder =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &encode($forwarder); $adminpasswdbackup = $adminpassword; $adminpasswdbackup =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $admin =~ s/<_CGI>/$cgi/gi; $admin =~ s/<_GRAFIK>/$graphics/gi; $admin =~ s/<_V>/$version/gi; $admin =~ s/<_M>/$msg/gi; $admin =~ s/<_ID>/&getauthorization/gie; $admin =~ s/<_ADMIN>/$realadminname/gi; $admin =~ s/<_FORWARDER>/$forwarder/gi; $admin =~ s/<_PASS>/$adminpasswdbackup/gi; $admin =~ s/<_EMAIL>/$email/gi; $admin =~ s/<_HP>/$url/gi; $admin =~ s/<_UD>/$server/gi; if($confirmadminin == "0"){ $admin =~ s/<_CAI1>/ checked/gi; $admin =~ s/<_CAI2>//gi; }else{ $admin =~ s/<_CAI2>/ checked/gi; $admin =~ s/<_CAI1>//gi; } if($confirmadminout == "0"){ $admin =~ s/<_CAO1>/ checked/gi; $admin =~ s/<_CAO2>//gi; }else{ $admin =~ s/<_CAO2>/ checked/gi; $admin =~ s/<_CAO1>//gi; } if($confirmuserin == "0"){ $admin =~ s/<_CUI1>/ checked/gi; $admin =~ s/<_CUI2>//gi; }else{ $admin =~ s/<_CUI2>/ checked/gi; $admin =~ s/<_CUI1>//gi; } if($confirmuserout == "0"){ $admin =~ s/<_CUO1>/ checked/gi; $admin =~ s/<_CUO2>//gi; }else{ $admin =~ s/<_CUO2>/ checked/gi; $admin =~ s/<_CUO1>//gi; } if($confirmmailuserout == "0"){ $admin =~ s/<_CMUO1>/ checked/gi; $admin =~ s/<_CMUO2>//gi; }else{ $admin =~ s/<_CMUO2>/ checked/gi; $admin =~ s/<_CMUO1>//gi; } if($confirmuser == "0"){ $admin =~ s/<_CU1>/ checked/gi; $admin =~ s/<_CU2>//gi; }else{ $admin =~ s/<_CU2>/ checked/gi; $admin =~ s/<_CU1>//gi; } if($confirmadminmail == "0"){ $admin =~ s/<_CAM1>/ checked/gi; $admin =~ s/<_CAM2>//gi; }else{ $admin =~ s/<_CAM2>/ checked/gi; $admin =~ s/<_CAM1>//gi; } if($unlockedmailuser == "0"){ $admin =~ s/<_UMU1>/ checked/gi; $admin =~ s/<_UMU2>//gi; }else{ $admin =~ s/<_UMU2>/ checked/gi; $admin =~ s/<_UMU1>//gi; } $admin =~ s/<_SENDMAIL>/$mailprog/gi; $admin =~ s/<_MAILHOST>/$mailhost/gi; $admin =~ s/<_TIMEOUTSMTP>/$timeoutsmtp/gi; $admin =~ s/<_SMTPUSER>/$smtpuser/gi; $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $admin =~ s/<_SMTPPASSWD>/$smtppasswd/gi; $admin =~ s/<_EMAILSPERCALL>/$emailspercall/gi; if($ban == "0"){ $admin =~ s/<_BAN1>/ checked/gi; $admin =~ s/<_BAN2>//gi; }else{ $admin =~ s/<_BAN2>/ checked/gi; $admin =~ s/<_BAN1>//gi; } if($howtosendemail == "0"){ $admin =~ s/<_HTSE1>/ checked/gi; $admin =~ s/<_HTSE2>//gi; }else{ $admin =~ s/<_HTSE2>/ checked/gi; $admin =~ s/<_HTSE1>//gi; } $admin =~ s/<_FT>/$floodingtimeout/gi; $admin =~ s/<_FILES>/$files/gi; $admin =~ s/<_STIMEOUT>/$stimeout/gi; $admin =~ s/<_GMT>/$gmt/gi; if($flock == "0"){ $admin =~ s/<_FLOCK1>/ checked/gi; $admin =~ s/<_FLOCK2>//gi; }else{ $admin =~ s/<_FLOCK2>/ checked/gi; $admin =~ s/<_FLOCK1>//gi; } if($sortemails == "0"){ $admin =~ s/<_SORT1>/ checked/gi; $admin =~ s/<_SORT2>//gi; $admin =~ s/<_SORT3>//gi; $admin =~ s/<_SORT4>//gi; $admin =~ s/<_SORT5>//gi; }elsif($sortemails == "1"){ $admin =~ s/<_SORT1>//gi; $admin =~ s/<_SORT2>/ checked/gi; $admin =~ s/<_SORT3>//gi; $admin =~ s/<_SORT4>//gi; $admin =~ s/<_SORT5>//gi; }elsif($sortemails == "2"){ $admin =~ s/<_SORT1>//gi; $admin =~ s/<_SORT2>//gi; $admin =~ s/<_SORT3>/ checked/gi; $admin =~ s/<_SORT4>//gi; $admin =~ s/<_SORT5>//gi; }elsif($sortemails == "3"){ $admin =~ s/<_SORT1>//gi; $admin =~ s/<_SORT2>//gi; $admin =~ s/<_SORT3>//gi; $admin =~ s/<_SORT4>/ checked/gi; $admin =~ s/<_SORT5>//gi; }else{ $admin =~ s/<_SORT1>//gi; $admin =~ s/<_SORT2>//gi; $admin =~ s/<_SORT3>//gi; $admin =~ s/<_SORT4>//gi; $admin =~ s/<_SORT5>/ checked/gi; } if($flooding == "0"){ $admin =~ s/<_FLOOD1>/ checked/gi; $admin =~ s/<_FLOOD2>//gi; }else{ $admin =~ s/<_FLOOD2>/ checked/gi; $admin =~ s/<_FLOOD1>//gi; } if($floodcookies == "0"){ $admin =~ s/<_FC1>/ checked/gi; $admin =~ s/<_FC2>//gi; }else{ $admin =~ s/<_FC2>/ checked/gi; $admin =~ s/<_FC1>//gi; } if($showstatus == "0"){ $admin =~ s/<_SSTATUS1>/ checked/gi; $admin =~ s/<_SSTATUS2>//gi; }else{ $admin =~ s/<_SSTATUS2>/ checked/gi; $admin =~ s/<_SSTATUS1>//gi; } if($eurodatum == "0"){ $admin =~ s/<_DATE1>/ checked/gi; $admin =~ s/<_DATE2>//gi; }else{ $admin =~ s/<_DATE2>/ checked/gi; $admin =~ s/<_DATE1>//gi; } if($emailfooter == "0"){ $admin =~ s/<_EF1>/ checked/gi; $admin =~ s/<_EF2>//gi; }else{ $admin =~ s/<_EF2>/ checked/gi; $admin =~ s/<_EF1>//gi; } if($emailheader == "0"){ $admin =~ s/<_EH1>/ checked/gi; $admin =~ s/<_EH2>//gi; }else{ $admin =~ s/<_EH2>/ checked/gi; $admin =~ s/<_EH1>//gi; } if($addfiles == "0"){ $admin =~ s/<_ADDFILES1>/ checked/gi; $admin =~ s/<_ADDFILES2>//gi; }else{ $admin =~ s/<_ADDFILES2>/ checked/gi; $admin =~ s/<_ADDFILES1>//gi; } if($sid == "0"){ $admin =~ s/<_SESSION1>/ checked/gi; $admin =~ s/<_SESSION2>//gi; }else{ $admin =~ s/<_SESSION2>/ checked/gi; $admin =~ s/<_SESSION1>//gi; } if($chmod == "0"){ $admin =~ s/<_CHMOD1>/ checked/gi; $admin =~ s/<_CHMOD2>//gi; }else{ $admin =~ s/<_CHMOD2>/ checked/gi; $admin =~ s/<_CHMOD1>//gi; } print "Content-type: text/html\n\n"; &adminheader; print $admin; &footer; exit; } # Konfiguration speichern sub adminsaveconfig { &adminauthorization; &adminshow($speech{'81'}) if($FORM{'cgi'} eq ""); &adminshow($speech{'82'}) if($FORM{'cgi'} !~ /^http:\/\//i); &adminshow($speech{'83'}) if($FORM{'grafik'} eq ""); # &adminshow($speech{'84'}) if($FORM{'grafik'} !~ /^http:\/\//i); &adminshow($speech{'85'}) if($FORM{'admin'} eq ""); &adminshow($speech{'86'}) if($FORM{'forwarder'} eq ""); &adminshow($speech{'87'}) if($FORM{'pass'} eq ""); &adminshow($speech{'88'}) if($FORM{'pass2'} eq ""); &adminshow($speech{'89'}) if($FORM{'pass'} ne $FORM{'pass2'}); &adminshow($speech{'90'}) if($FORM{'email'} eq ""); &adminshow($speech{'114'}) if($FORM{'update'} eq ""); foreach $i (split(/\, |\,|\; |\;| /, $FORM{'email'})){ &adminshow($speech{'91'}) if($i !~ /\@/ || $i !~ /\./); $i =~ s/\@/\\\@/g; $newemail .= "$i, "; } $newemail =~ s/, $//; &adminshow($speech{'92'}) if($FORM{'sendmail'} eq "" && $FORM{'mailhost'} eq ""); &adminshow($speech{'93'}) if($FORM{'mailhost'} eq "" && $FORM{'sendmail'} eq ""); &adminshow($speech{'94'}) if($FORM{'timeoutsmtp'} eq "" && $FORM{'mailhost'} ne ""); &adminshow($speech{'95'}) if($FORM{'timeoutsmtp'} =~ /\D/ && $FORM{'mailhost'} ne ""); &adminshow($speech{'96'}) if($FORM{'smtpuser'} eq "" && $FORM{'mailhost'} ne ""); &adminshow($speech{'97'}) if($FORM{'smtppasswd'} eq "" && $FORM{'mailhost'} ne ""); &adminshow($speech{'98'}) if($FORM{'smtppasswd2'} eq "" && $FORM{'mailhost'} ne ""); &adminshow($speech{'99'}) if($FORM{'smtppasswd'} ne $FORM{'smtppasswd2'} && $FORM{'mailhost'} ne ""); &adminshow($speech{'100'}) if($FORM{'emailspercall'} eq ""); &adminshow($speech{'101'}) if($FORM{'emailspercall'} =~ /\D/); &adminshow($speech{'102'}) if($FORM{'floodingtimeout'} eq ""); &adminshow($speech{'103'}) if($FORM{'floodingtimeout'} =~ /\D/); &adminshow($speech{'104'}) if($FORM{'files'} eq ""); &adminshow($speech{'105'}) if($FORM{'stimeout'} eq ""); &adminshow($speech{'106'}) if($FORM{'stimeout'} =~ /\D/); &adminshow($speech{'107'}) if($FORM{'gmt'} eq ""); &adminshow($speech{'108'}) if($FORM{'gmt'} !~ /\+\d+|\-\d+|\d+/); foreach $i (split(/\, |\,|\; |\;/, $FORM{'admin'})){ $i = unpack("H*", $i); $newadmin .= "$i, "; } $newadmin =~ s/, $//; $FORM{'forwarder'} = unpack("H*", $FORM{'forwarder'}); $FORM{'pass'} = unpack("H*", $FORM{'pass'}); $FORM{'smtppasswd'} = unpack("H*", $FORM{'smtppasswd'}); $config = qq~\$cgi = "$FORM{'cgi'}";\n\$graphics = "$FORM{'grafik'}";\n\$adminname = "$newadmin";\n\$forwarder = "$FORM{'forwarder'}";\n~; $config .= qq~\$adminpassword = "$FORM{'pass'}";\n\$email = "$newemail";\n\$url = "$FORM{'homepage'}";\n\$mailprog = "$FORM{'sendmail'}";\n~; $config .= qq~\$floodingtimeout = "$FORM{'floodingtimeout'}";\n\$mailhost = "$FORM{'mailhost'}";\n\$timeoutsmtp = "$FORM{'timeoutsmtp'}";\n\$smtpuser = "$FORM{'smtpuser'}";\n\$smtppasswd = "$FORM{'smtppasswd'}";\n\$files = "$FORM{'files'}";\n\$emailspercall = "$FORM{'emailspercall'}";\n~; $config .= qq~\$stimeout = "$FORM{'stimeout'}";\n\$server = "$FORM{'update'}";\n\$gmt = "$FORM{'gmt'}";\n~; if($FORM{'flock'} eq "0"){ $config .= qq~\$flock = "1";\n~; $newflock = "1"; }else{ $config .= qq~\$flock = "0";\n~; $newflock = "0"; } if($FORM{'confirmadminin'} eq "0"){ $config .= qq~\$confirmadminin = "0";\n~; }else{ $config .= qq~\$confirmadminin = "1";\n~; } if($FORM{'confirmadminout'} eq "0"){ $config .= qq~\$confirmadminout = "0";\n~; }else{ $config .= qq~\$confirmadminout = "1";\n~; } if($FORM{'confirmuserin'} eq "0"){ $config .= qq~\$confirmuserin = "0";\n~; }else{ $config .= qq~\$confirmuserin = "1";\n~; } if($FORM{'confirmuserout'} eq "0"){ $config .= qq~\$confirmuserout = "0";\n~; }else{ $config .= qq~\$confirmuserout = "1";\n~; } if($FORM{'confirmmailuserout'} eq "0"){ $config .= qq~\$confirmmailuserout = "0";\n~; }else{ $config .= qq~\$confirmmailuserout = "1";\n~; } if($FORM{'confirmuser'} eq "0"){ $config .= qq~\$confirmuser = "0";\n~; }else{ $config .= qq~\$confirmuser = "1";\n~; } if($FORM{'sortemails'} =~ /\d/){ $config .= qq~\$sortemails = "$FORM{'sortemails'}";\n~; }else{ $config .= qq~\$sortemails = "0";\n~; } if($FORM{'flooding'} eq "0"){ $config .= qq~\$flooding = "0";\n~; }else{ $config .= qq~\$flooding = "1";\n~; } if($FORM{'floodcookies'} eq "0"){ $config .= qq~\$floodcookies = "0";\n~; }else{ $config .= qq~\$floodcookies = "1";\n~; } if($FORM{'showstatus'} eq "0"){ $config .= qq~\$showstatus = "0";\n~; }else{ $config .= qq~\$showstatus = "1";\n~; } if($FORM{'confirmadminmail'} eq "0"){ $config .= qq~\$confirmadminmail = "0";\n~; }else{ $config .= qq~\$confirmadminmail = "1";\n~; } if($FORM{'unlockedmailuser'} eq "0"){ $config .= qq~\$unlockedmailuser = "0";\n~; }else{ $config .= qq~\$unlockedmailuser = "1";\n~; } if($FORM{'ban'} eq "0"){ $config .= qq~\$ban = "0";\n~; }else{ $config .= qq~\$ban = "1";\n~; } if($FORM{'howtosendemail'} eq "0"){ $config .= qq~\$howtosendemail = "0";\n~; }else{ $config .= qq~\$howtosendemail = "1";\n~; } if($FORM{'date'} eq "0"){ $config .= qq~\$eurodatum = "0";\n~; }else{ $config .= qq~\$eurodatum = "1";\n~; } if($FORM{'emailfooter'} eq "0"){ $config .= qq~\$emailfooter = "0";\n~; }else{ $config .= qq~\$emailfooter = "1";\n~; } if($FORM{'emailheader'} eq "0"){ $config .= qq~\$emailheader = "0";\n~; }else{ $config .= qq~\$emailheader = "1";\n~; } if($FORM{'addfiles'} eq "0"){ $config .= qq~\$addfiles = "0";\n~; }else{ $config .= qq~\$addfiles = "1";\n~; } if($FORM{'session'} eq "0"){ $config .= qq~\$sid = "0";\n~; }else{ $config .= qq~\$sid = "1";\n~; } if($FORM{'chmod'} eq "0"){ $config .= qq~\$chmod = "0";\n~; }else{ $config .= qq~\$chmod = "1";\n~; } $config .= qq~\n1;~; open(F, "> data/config.txt") || die ¬eerror($speech{'1'}, 'data/config.txt', $!); flock(F,2) if($newflock); print F $config; flock(F,8) if($newflock); close(F); &adminshow($speech{'109'}); } # Newsletterformular anzeigen sub adminshownewsletter { &adminauthorization; open(F, "templates/adminnewsletter.htm") || die ¬eerror($speech{'0'}, 'templates/adminnewsletter.htm', $!); flock(F,2) if($flock); $admin = join("",); flock(F,8) if($flock); close(F); open(F, "data/smileys.txt") || die ¬eerror($speech{'0'}, 'data/smileys.txt', $!); flock(F,2) if($flock); @smileys = ; flock(F,8) if($flock); close(F); if($sid == "0"){ $id = $INFO{'id'}; }else{ $id = $adminpassword; } $x = "1"; foreach $i (@smileys){ chomp($i); ($symbol, $des, $file) = split(/\|/, $i); last if($x > "16"); $hex = unpack("H*", $file); $y = $x - 1; if(($x % 4) eq "0"){ $smileys .= qq~$des
~; }else{ $smileys .= qq~$des ~; } $x++; } $admin =~ m//gis; $content = $1; foreach $i (split(/, |,/, $email)){ $out .= $content; $out =~ s/<_EMAIL>/$i/gi; } if($INFO{'msg'} eq ""){ $msg = shift || $speech{'29'}; }else{ $x = $INFO{'msg'}; $msg = $speech{$x}; } $admin =~ s/<_CGI>/$cgi/gi; $admin =~ s/<_GRAFIK>/$graphics/gi; $admin =~ s/<_ID>/&getauthorization/gie; $admin =~ s/<_SMILEYS>/$smileys/gi; $admin =~ s/<_M>/$msg/gi; $admin =~ s/<_STATUS>/$showstatus/gi; $admin =~ s//$out/gis; $admin =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &adminheader; print $admin; &footer; exit; } # Smileys anzeigen sub adminshowsmileys { &adminauthorization; &error($speech{'21'}) if($INFO{'smiley'} eq ""); $INFO{'smiley'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; open(F, "smileys/$INFO{'smiley'}") || die ¬eerror($speech{'0'}, "smileys/$INFO{'smiley'}", $!); flock(F,2) if($flock); binmode(F); $smiley = join("",); flock(F,8) if($flock); close(F); binmode(STDOUT); if($INFO{'smiley'} =~ m/\.gif$/i){ print "Content-type: image/gif\n\n"; }elsif($INFO{'smiley'} =~ m/\.jpg$|\.jpeg$/i){ print "Content-type: image/jpg\n\n"; }elsif($INFO{'smiley'} =~ m/\.png$/i){ print "Content-type: image/png\n\n"; } print $smiley; exit; } # Smileys anzeigen sub adminshowallsmileys { &adminauthorization; open(F, "data/smileys.txt") || die ¬eerror($speech{'0'}, 'data/smileys.txt', $!); flock(F,2) if($flock); @smileys = ; flock(F,8) if($flock); close(F); if($sid == "0"){ $id = $INFO{'id'}; }else{ $id = $adminpassword; } open(F, "templates/smileys.htm") || die ¬eerror($speech{'0'}, 'templates/smileys.htm', $!); flock(F,2) if($flock); ($split, $split2, $split3) = split(// , (join("",))); foreach $i (@smileys){ chomp($i); ($symbol, $beschreibung, $bild) = split(/\|/, $i); $hex = unpack("H*", $bild); $smileys .= $split2; $smileys =~ s/<_SY>/$symbol/gi; $smileys =~ s/<_BE>/$beschreibung/gi; $smileys =~ s/<_SM>/$cgi\/ebnewsletter\.cgi\?action=admin&do=smileys&smiley=$hex&id=$id/gi; } flock(F,8) if($flock); close(F); $smileys =~ s/^0//; print "Content-type: text/html\n\n"; print $split, $smileys, $split3; exit; } # Newsletter versenden sub adminsendnewsletter { &adminauthorization; if($INFO{'s'} eq "1"){ unless(-e("data/newsletter.txt")){ $id = &getauthorization; print "Location: $cgi/ebnewsletter.cgi?action=admin&do=sendnewsletter&id=$id&s=1\n\n"; exit; } } $now = $INFO{'now'} || "0"; if($now == "0" && $INFO{'s'} ne "1"){ if($FORM{'test'} ne "1"){ open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); &adminshownewsletter($speech{'43'}) if(@emails eq ""); } &adminshownewsletter($speech{'30'}) if($FORM{'forwarder'} eq "" && $forwarder eq ""); &adminshownewsletter($speech{'31'}) if($FORM{'subject'} eq ""); &adminshownewsletter($speech{'5'}) if(&validateemail($FORM{'email'})); &adminshownewsletter($speech{'32'}) if($FORM{'message'} eq ""); &adminshownewsletter($speech{'33'}) if($FORM{'option'} eq "1" && $FORM{'message'} !~ m/.*?<\/html>/gis); &adminshownewsletter($speech{'34'}) if($FORM{'option'} eq "1" && $FORM{'message'} !~ m//i && $FORM{'message'} !~ m/<\/head>/i); &adminshownewsletter($speech{'35'}) if($FORM{'option'} eq "1" && $FORM{'message'} !~ m//i && $FORM{'message'} !~ m/<\/body>/i); $newsletter = "Return-Path: <$FORM{'email'}>\n"; if($forwarder ne ""){ $forwarder =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $newsletter .= "From: $forwarder <$FORM{'email'}>\n"; $sentby = $forwarder; }else{ $newsletter .= "From: $FORM{'forwarder'} <$FORM{'email'}>\n"; $sentby = $FORM{'forwarder'}; } $newsletter .= "To: <_EMAIL>\n"; $newsletter .= "Subject: $FORM{'subject'}\n"; $newsletter .= "MIME-Version: 1.0\n"; $newsletter .= "X-Priority: $FORM{'priority'}\n"; $newsletter .= "X-Mailer: EBNewsLetter $version\n"; if($FORM{'received'} eq "1"){ if($forwarder ne ""){ $disposition = "$forwarder <$FORM{'email'}>"; }else{ $disposition = "$FORM{'forwarder'} <$FORM{'email'}>"; } $newsletter .= "Disposition-Notification-To: $disposition\n"; } if($FORM{'replyto'} ne ""){ $newsletter .= "Reply-To: $FORM{'replyto'}\n"; } opendir(D, "$files") || die ¬eerror($speech{'36'}, '$files', $!); @files = grep{$_ =~ m/\w/} readdir(D); closedir(D); if($FORM{'option'} eq "0"){ if((@files ne "" && $addfiles eq "0") || $FILE{'uploaddata01'} ne "" || $FILE{'uploaddata02'} ne "" || $FILE{'uploaddata03'} ne "" || $FILE{'uploaddata04'} ne "" || $FILE{'uploaddata05'} ne ""){ $boundary = &generate_boundary; $newsletter .= "Content-type: multipart/mixed; boundary=\"$boundary\"\n"; $header = "0"; }else{ $newsletter .= "Content-type: text/plain; "; if($FORM{'characterset'} eq "0"){ $newsletter .= "charset=\"iso-8859-1\"\n"; }else{ $newsletter .= "charset=\"utf-8\"\n"; } $header = "1"; } }else{ if((@files ne "" && $addfiles eq "0") || $FILE{'uploaddata01'} ne "" || $FILE{'uploaddata02'} ne "" || $FILE{'uploaddata03'} ne "" || $FILE{'uploaddata04'} ne "" || $FILE{'uploaddata05'} ne ""){ $boundary = &generate_boundary; $newsletter .= "Content-type: multipart/mixed; boundary=\"$boundary\"\n"; $header = "2"; }else{ $newsletter .= "Content-type: text/html; "; if($FORM{'characterset'} eq "0"){ $newsletter .= "charset=\"iso-8859-1\"\n"; }else{ $newsletter .= "charset=\"utf-8\"\n"; } $header = "3"; } } $allfiles = "0"; if($FILE{'uploaddata01'} ne ""){ $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $MIME{'uploaddata01'}; name=\"$FILE{'uploaddata01'}\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$FILE{'uploaddata01'}>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$FILE{'uploaddata01'}\"\n\n"; $attachment .= &encodebase64($FORM{'uploaddata01'}); $attachment .= "\n\n--$boundary\n"; $allfiles++; } if($FILE{'uploaddata02'} ne ""){ $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $MIME{'uploaddata02'}; name=\"$FILE{'uploaddata02'}\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$FILE{'uploaddata02'}>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$FILE{'uploaddata02'}\"\n\n"; $attachment .= &encodebase64($FORM{'uploaddata02'}); $attachment .= "\n\n--$boundary\n"; $allfiles++; } if($FILE{'uploaddata03'} ne ""){ $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $MIME{'uploaddata03'}; name=\"$FILE{'uploaddata03'}\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$FILE{'uploaddata03'}>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$FILE{'uploaddata03'}\"\n\n"; $attachment .= &encodebase64($FORM{'uploaddata03'}); $attachment .= "\n\n--$boundary\n"; $allfiles++; } if($FILE{'uploaddata04'} ne ""){ $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $MIME{'uploaddata04'}; name=\"$FILE{'uploaddata04'}\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$FILE{'uploaddata04'}>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$FILE{'uploaddata04'}\"\n\n"; $attachment .= &encodebase64($FORM{'uploaddata04'}); $attachment .= "\n\n--$boundary\n"; $allfiles++; } if($FILE{'uploaddata05'} ne ""){ $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $MIME{'uploaddata05'}; name=\"$FILE{'uploaddata05'}\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$FILE{'uploaddata05'}>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$FILE{'uploaddata05'}\"\n\n"; $attachment .= &encodebase64($FORM{'uploaddata05'}); $attachment .= "\n\n--$boundary\n"; $allfiles++; } if($addfiles == "0"){ open(F, "data/mimetypes.txt") || die ¬eerror($speech{'0'}, 'data/mimetypes.txt', $!); flock(F,2) if($flock); @mimetypes = ; flock(F,8) if($flock); close(F); foreach $i (@files){ $allfiles++; open(F, "$files/$i") || die ¬eerror($speech{'0'}, '$files/$i', $!); flock(F,2) if($flock); binmode(F); $filecontent = join("",); flock(F,8) if($flock); close(F); foreach $a (@mimetypes){ chomp($a); ($type, $ending, $encode) = split(/\t+/, $a); foreach $b (split(/\,/, $ending)){ if($i =~ m/\.$b$/i){ $mime = $type; last; } } } $mime = "application/octet-stream" if($mime eq ""); $attachment .= "\n--$boundary\n"; $attachment .= "Content-type: $mime; name=\"$i\"\n"; $attachment .= "Content-Transfer-Encoding: base64\n"; $attachment .= "Content-ID: <$i>\n"; $attachment .= "Content-Disposition: attachment; filename=\"$i\"\n\n"; $attachment .= &encodebase64($filecontent); $attachment .= "\n\n--$boundary\n"; } } if($emailheader == "0"){ open(F, "data/emailheader.txt") || die ¬eerror($speech{'0'}, 'data/emailheader.txt', $!); flock(F,2) if($flock); $contentheader = join("",); flock(F,8) if($flock); close(F); $FORM{'message'} = "$contentheader$FORM{'message'}"; } if($emailfooter == "0"){ open(F, "data/emailfooter.txt") || die ¬eerror($speech{'0'}, 'data/emailfooter.txt', $!); flock(F,2) if($flock); $contentfooter = join("",); flock(F,8) if($flock); close(F); $FORM{'message'} .= $contentfooter; } if($FORM{'characterset'} == "1"){ $FORM{'message'} = &utf8($FORM{'message'}); } if($header == "0"){ $newsletter .= "\n--$boundary\n"; $newsletter .= "Content-type: text/plain; "; if($FORM{'characterset'} eq "0"){ $newsletter .= "charset=\"iso-8859-1\"\n"; }else{ $newsletter .= "charset=\"utf-8\"\n"; } $newsletter .= "Content-Transfer-Encoding: 7bit\n\n"; $newsletter .= "$FORM{'message'}\n"; $newsletter .= "$attachment\n"; }elsif($header == "1"){ $newsletter .= "\n$FORM{'message'}\n"; }elsif($header == "2"){ $newsletter .= "\n--$boundary\n"; $newsletter .= "Content-type: text/html; "; if($FORM{'characterset'} eq "0"){ $newsletter .= "charset=\"iso-8859-1\"\n"; }else{ $newsletter .= "charset=\"utf-8\"\n"; } $newsletter .= "Content-Transfer-Encoding: 7bit\n\n"; $newsletter .= "$FORM{'message'}\n"; $newsletter .= "\n--$boundary\n"; $newsletter .= "$attachment\n"; }elsif($header == "3"){ $newsletter .= "\n$FORM{'message'}\n"; } open(F, "> data/newsletter.txt") || die ¬eerror($speech{'1'}, 'data/newsletter.txt', $!); flock(F,2) if($flock); print F $newsletter; flock(F,8) if($flock); close(F); &encode($FORM{'subject'}); &encode($FORM{'message'}); &encode($sentby); $newsletter =~ s/[\n\r]/\[br\]/gs; open(F, ">> data/archiv.txt") || die ¬eerror($speech{'1'}, 'data/archiv.txt', $!); flock(F,2) if($flock); print F "$zeit\|$ip\|$FORM{'option'}\|$FORM{'characterset'}\|$allfiles\|$sentby\|$FORM{'subject'}\|$FORM{'message'}\|$newsletter\n"; flock(F,8) if($flock); close(F); } if($INFO{'s'} ne "1" && $FORM{'test'} ne "1" && $showstatus == "0"){ &adminshownewsletter($speech{'29'}); exit; } if($howtosendemail == "0"){ &adminshownewsletter($speech{'10'}) if($availablemailprog eq ""); }else{ &adminviewnewsletter($speech{'12'}) unless($netsmtp); } if($howtosendemail == "0"){ open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); open(F, "data/newsletter.txt") || die ¬eerror($speech{'0'}, 'data/newsletter.txt', $!); flock(F,2) if($flock); $newsletter = join("",); flock(F,8) if($flock); close(F); if($FORM{'test'} eq "1"){ $newsletter =~ s/<_EMAIL>/$FORM{'email'}/gi; $newsletter =~ s/<_URL>/$url/gi; $newsletter =~ s/<_DATE>/$zeit2/gi; $newsletter =~ s/<_DT>/$zeit/gi; open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M $newsletter; close(M); unlink("data/newsletter.txt"); if($success eq "0"){ &adminshownewsletter($speech{'38'}); }else{ &adminshownewsletter($speech{'39'}); } }else{ $end = "1" if(($now + $emailspercall) >= @emails); for($i=$now; $i<=($now + $emailspercall - 1); $i++){ chomp($emails[$i]); @data = split(/\|/, $emails[$i]); next if($data[3] ne "0"); if($emails[$i] eq "" && (@emails - 1) < $i){ $end = "1"; last; } $nlready = $newsletter; $nlready =~ s/<_EMAIL>/$data[0]/gi; $nlready =~ s/<_URL>/$url/gi; $nlready =~ s/<_DATE>/$zeit2/gi; $nlready =~ s/<_DT>/$zeit/gi; open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M $nlready; close(M); } if($showstatus == "0"){ open(F, "templates/status.htm"); flock(F,2) if($flock); $status = join("",); flock(F,8) if($flock); close(F); if($end eq "1"){ $status =~ s///gis; $status =~ s//$1/gis; $status =~ s/<_MSG>/$speech{'41'}/gi; $status =~ s/<_ID>/&getauthorization/gie; $next = $now + $emailspercall; $status =~ s/<_CGI>/$cgi/gi; $status =~ s/<_GRAFIK>/$graphics/gi; $status =~ s/<_W1>/100/gi; $status =~ s/<_W2>/0/gi; $all = scalar(@emails); $status =~ s/<_NL>/$all/gi; $status =~ s/<_S>/$all/gi; $status =~ s/<_NS>/0/gi; $bytes = length($nlready) * scalar(@emails); $status =~ s/<_B>/$bytes/gi; $kb = sprintf("%.3f", $bytes / 1024); $status =~ s/<_KB>/$kb/gi; unlink("data/newsletter.txt"); }else{ $status =~ s//$1/gis; $status =~ s///gis; $status =~ s/<_MSG>/$speech{'40'}/gi; $status =~ s/<_ID>/&getauthorization/gie; $next = $now + $emailspercall; $status =~ s/<_CGI>/$cgi/gi; $status =~ s/<_GRAFIK>/$graphics/gi; $status =~ s/<_N>/$next/gi; $now2 = $now + 1; $w1 = int(($now2 / @emails) * 100); $w2 = 100 - $w1; $status =~ s/<_W1>/$w1/gi; $status =~ s/<_W2>/$w2/gi; $all = scalar(@emails); $status =~ s/<_NL>/$all/gi; $status =~ s/<_S>/$now2/gi; $ns = $all - $now2; $status =~ s/<_NS>/$ns/gi; $bytes = length($nlready) * $now2; $status =~ s/<_B>/$bytes/gi; $kb = sprintf("%.3f", ($bytes / 1024)); $status =~ s/<_KB>/$kb/gi; } print "Content-type: text/html\n\n"; print $status; exit; }else{ if($end eq "1"){ unlink("data/newsletter.txt"); &adminshownewsletter($speech{'42'}); exit; }else{ $next = $now + $emailspercall; $id = &getauthorization; print "Location: $cgi/ebnewsletter.cgi?action=admin&do=sendnewsletter&id=$id&now=$next\n\n"; exit; } } } }else{ open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); open(F, "data/newsletter.txt") || die ¬eerror($speech{'0'}, 'data/newsletter.txt', $!); flock(F,2) if($flock); $newsletter = join("",); flock(F,8) if($flock); close(F); if($FORM{'test'} eq "1"){ $newsletter =~ s/<_EMAIL>/$FORM{'email'}/gi; $newsletter =~ s/<_URL>/$url/gi; $newsletter =~ s/<_DATE>/$zeit2/gi; $newsletter =~ s/<_DT>/$zeit/gi; $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or die &writelogfile($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); $smtp->recipient($FORM{'email'}); $smtp->data() or die &writelogfile($speech{'14'}, $FORM{'email'}, $!); $smtp->datasend($newsletter); $smtp->dataend(); $smtp->quit(); unlink("data/newsletter.txt"); if($success eq "0"){ &adminshownewsletter($speech{'38'}); }else{ &adminshownewsletter($speech{'39'}); } }else{ $end = "1" if(($now + $emailspercall) >= @emails); for($i=$now; $i<=($now + $emailspercall - 1); $i++){ chomp($emails[$i]); @data = split(/\|/, $emails[$i]); next if($data[3] ne "0"); if($emails[$i] eq "" && (@emails - 1) < $i){ $end = "1"; last; } $nlready = $newsletter; $nlready =~ s/<_EMAIL>/$data[0]/gi; $nlready =~ s/<_URL>/$url/gi; $nlready =~ s/<_DATE>/$zeit2/gi; $nlready =~ s/<_DT>/$zeit/gi; $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or &writelogfile($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); $smtp->recipient($data[0]); $smtp->data() or &writelogfile($speech{'14'}, $FORM{'email'}, $!); $smtp->datasend($nlready); $smtp->dataend(); $smtp->quit(); } if($showstatus == "0"){ open(F, "templates/status.htm"); flock(F,2) if($flock); $status = join("",); flock(F,8) if($flock); close(F); if($end eq "1"){ $status =~ s///gis; $status =~ s//$1/gis; $status =~ s/<_MSG>/$speech{'41'}/gi; $status =~ s/<_ID>/&getauthorization/gie; $next = $now + $emailspercall; $status =~ s/<_CGI>/$cgi/gi; $status =~ s/<_GRAFIK>/$graphics/gi; $status =~ s/<_W1>/100/gi; $status =~ s/<_W2>/0/gi; $all = scalar(@emails); $status =~ s/<_NL>/$all/gi; $status =~ s/<_S>/$all/gi; $status =~ s/<_NS>/0/gi; $bytes = length($nlready) * scalar(@emails); $status =~ s/<_B>/$bytes/gi; $kb = sprintf("%.3f", $bytes / 1024); $status =~ s/<_KB>/$kb/gi; unlink("data/newsletter.txt"); }else{ $status =~ s//$1/gis; $status =~ s///gis; $status =~ s/<_MSG>/$speech{'40'}/gi; $status =~ s/<_ID>/&getauthorization/gie; $next = $now + $emailspercall; $status =~ s/<_CGI>/$cgi/gi; $status =~ s/<_GRAFIK>/$graphics/gi; $status =~ s/<_N>/$next/gi; $now2 = $now + 1; $w1 = int(($now2 / @emails) * 100); $w2 = 100 - $w1; $status =~ s/<_W1>/$w1/gi; $status =~ s/<_W2>/$w2/gi; $all = scalar(@emails); $status =~ s/<_NL>/$all/gi; $status =~ s/<_S>/$now2/gi; $ns = $all - $now2; $status =~ s/<_NS>/$ns/gi; $bytes = length($nlready) * $now2; $status =~ s/<_B>/$bytes/gi; $kb = sprintf("%.3f", ($bytes / 1024)); $status =~ s/<_KB>/$kb/gi; } print "Content-type: text/html\n\n"; print $status; exit; }else{ if($end eq "1"){ unlink("data/newsletter.txt"); &adminshownewsletter($speech{'42'}); exit; }else{ $next = $now + $emailspercall; $id = &getauthorization; print "Location: $cgi/ebnewsletter.cgi?action=admin&do=sendnewsletter&id=$id&now=$next\n\n"; exit; } } } } } # Boundarys generieren sub generate_boundary { @generateboundary = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9); foreach $i (1..20){ $generated .= $generateboundary[int(rand($#generateboundary + 1))]; } $bound = "----------".$generated; chomp($bound); return $bound; } # Attachment nach Base64 konvertieren sub encodebase64 { $code = shift; while ($code =~ /(.{1,45})/gs){ $encode .= substr(pack('u', $1), 1); chop($encode); } $encode =~ tr|` -_|AA-Za-z0-9+/|; $align = (3 - length($code) % 3) % 3; $encode =~ s/.{$align}$/'=' x $align/e if($align); $encode =~ s/(.{1,76})/$1\n/g; chomp($encode); return $encode; } # String in UTF-8 konvertieren sub utf8 { $string = shift; %utf8 = (); $string =~ s/([\x80-\xff])/$utf8{$1} ||= iso($1)/eg; return $string; } # Funktion zum Konvertieren zu UTF-8 sub iso { $string = shift; $iso = ord($string); $s1 = ((($iso & 0xc0) >> 6) | 0xc0); $s2 = ($iso & 0x3f) | 0x80; return chr($s1).chr($s2); } # Dateien heraufladen sub adminshowuploadfiles { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminuploadfiles.htm") || die ¬eerror($speech{'0'}, 'templates/adminuploadfiles.htm', $!); flock(F,2) if($flock); ($split, $split2, $split3) = split(// , (join("",))); flock(F,8) if($flock); close(F); opendir(D, "$files") || die ¬eerror($speech{'36'}, '$files', $!); foreach $i (readdir(D)){ if(-e("$files/$i") && $i !~ m/^\.$|^\.\.$/){ $hex = unpack("H*", $i); $output .= $split2; $output =~ s/<_NAME>/$hex/gi; $output =~ s/<_CGI>/$cgi/gi; $output =~ s/<_GRAFIK>/$graphics/gi; $output =~ s/<_ID>/&getauthorization/gie; &encode($i); $output =~ s/<_FILE>/$i/gi; $bytes = (stat("$files/$i"))[7]; $kb = sprintf("%.3f", ($bytes / 1024)); $edit = (stat("$files/$i"))[9]; if($gmt == "0"){ $TimeGMT = $edit; }elsif($gmt =~ m/^\-/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = $edit - ($gmt2 * 3600); }elsif($gmt =~ m/^\+/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = $edit + ($gmt2 * 3600); } ($sec, $min, $hours, $day, $month, $year, $wday, $yday, $isdst) = localtime($TimeGMT); $month += 1; $year += 1900; $min = "0$min" if($min < "10"); $sec = "0$sec" if($sec < "10"); $hours = "0$hours" if($hours < "10"); $day = "0$day" if($day < "10"); $month = "0$month" if($month < "10"); if($eurodatum == "0"){ $zeit = "$day.$month.$year"; $zeit .= ", $hours:$min:$sec"; }else{ $zeit = "$month/$day/$year"; $zeit .= ", $hours:$min:$sec"; } $output =~ s/<_B>/$bytes/gi; $output =~ s/<_KB>/$kb/gi; $output =~ s/<_EDIT>/$zeit/gi; } } closedir(D); $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_M>/$msg/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_V>/$version/gi; $split3 =~ s/<_CGI>/$cgi/gi; $split3 =~ s/<_GRAFIK>/$graphics/gi; $split3 =~ s/<_ID>/&getauthorization/gie; $split3 =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &adminheader; print $split, $output, $split3; &footer; exit; } # Dateien sortieren sub adminsortfiles { &adminauthorization; open(F, "templates/adminuploadfiles.htm") || die ¬eerror($speech{'0'}, 'templates/adminuploadfiles.htm', $!); flock(F,2) if($flock); ($split, $split2, $split3) = split(// , (join("",))); flock(F,8) if($flock); close(F); opendir(D, "$files") || die ¬eerror($speech{'36'}, '$files', $!); @files = readdir(D); closedir(D); if($FORM{'sort'} eq "0"){ @files = sort{(stat("$files/$a"))[7] <=> (stat("$files/$b"))[7]} @files; }elsif($FORM{'sort'} eq "1"){ @files = sort{(stat("$files/$a"))[9] <=> (stat("$files/$b"))[9]} @files; }elsif($FORM{'sort'} eq "2"){ @files = sort{uc($a) cmp uc($b)} @files; }elsif($FORM{'sort'} eq "3"){ @files = sort{uc($b) cmp uc($a)} @files; }elsif($FORM{'sort'} eq "4"){ $i = @files; while ($i--){ $j = int(rand($i + 1)); @files[$i, $j] = @files[$j, $i]; } } foreach $i (@files){ if(-e("$files/$i") && $i !~ m/^\.$|^\.\.$/){ $hex = unpack("H*", $i); $output .= $split2; $output =~ s/<_NAME>/$hex/gi; $output =~ s/<_CGI>/$cgi/gi; $output =~ s/<_GRAFIK>/$graphics/gi; $output =~ s/<_ID>/&getauthorization/gie; &encode($i); $output =~ s/<_FILE>/$i/gi; $bytes = (stat("$files/$i"))[7]; $kb = sprintf("%.3f", ($bytes / 1024)); $edit = (stat("$files/$i"))[9]; if($gmt == "0"){ $TimeGMT = $edit; }elsif($gmt =~ m/^\-/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = $edit - ($gmt2 * 3600); }elsif($gmt =~ m/^\+/){ $gmt2 = $gmt; $gmt2 =~ s/[^0-9]//g; $TimeGMT = $edit + ($gmt2 * 3600); } ($sec, $min, $hours, $day, $month, $year, $wday, $yday, $isdst) = localtime($TimeGMT); $month += 1; $year += 1900; $min = "0$min" if($min < "10"); $sec = "0$sec" if($sec < "10"); $hours = "0$hours" if($hours < "10"); $day = "0$day" if($day < "10"); $month = "0$month" if($month < "10"); if($eurodatum == "0"){ $zeit = "$day.$month.$year"; $zeit .= ", $hours:$min:$sec"; }else{ $zeit = "$month/$day/$year"; $zeit .= ", $hours:$min:$sec"; } $output =~ s/<_B>/$bytes/gi; $output =~ s/<_KB>/$kb/gi; $output =~ s/<_EDIT>/$zeit/gi; } } $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_M>/$speech{'52'}/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_V>/$version/gi; $split3 =~ s/<_CGI>/$cgi/gi; $split3 =~ s/<_GRAFIK>/$graphics/gi; $split3 =~ s/<_ID>/&getauthorization/gie; $split3 =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &adminheader; print $split, $output, $split3; &footer; exit; } # Datei anschauen sub adminviewfile { &adminauthorization; $INFO{'file'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; &adminshowuploadfiles($speech{'49'}) unless(-e("$files/$INFO{'file'}")); open(F, "$files/$INFO{'file'}") || die ¬eerror($speech{'0'}, "$files/$INFO{'file'}", $!); flock(F,2) if($flock); binmode(F); $filecontent = join("",); flock(F,8) if($flock); close(F); open(F, "data/mimetypes.txt") || die ¬eerror($speech{'0'}, 'data/mimetypes.txt', $!); flock(F,2) if($flock); @mimetypes = ; flock(F,8) if($flock); close(F); foreach $i (@mimetypes){ chomp($i); ($type, $ending, $encode) = split(/\t+/, $a); $mime = $type if($INFO{'file'} =~ m/\.$ending$/); } $mime = "application/octet-stream" if($mime eq ""); binmode(STDOUT); print "Content-type: $mime\n\n"; print $filecontent; exit; } # Dateien heraufladen sub adminuploadfiles { &adminauthorization; &adminshowuploadfiles($speech{'48'}) if($FILE{'uploaddata01'} eq "" && $FILE{'uploaddata02'} eq "" && $FILE{'uploaddata03'} eq "" && $FILE{'uploaddata04'} eq "" && $FILE{'uploaddata05'} eq ""); if($FILE{'uploaddata01'} ne ""){ &error($speech{'45'}) if(-e("$files/$FILE{'uploaddata01'}")); open(F, "> $files/$FILE{'uploaddata01'}") || die ¬eerror($speech{'1'}, "$files/$FILE{'uploaddata01'}", $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata01'}; flock(F,8) if($flock); close(F); chmod(0777,"$absolutfile/$FILE{'uploaddata01'}") if($chmod eq "0"); &error($speech{'46'}) unless(-e("$files/$FILE{'uploaddata01'}")); } if($FILE{'uploaddata02'} ne ""){ &error($speech{'45'}) if(-e("$files/$FILE{'uploaddata02'}")); open(F, "> $files/$FILE{'uploaddata02'}") || die ¬eerror($speech{'1'}, "$files/$FILE{'uploaddata02'}", $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata02'}; flock(F,8) if($flock); close(F); chmod(0777,"$absolutfile/$FILE{'uploaddata02'}") if($chmod eq "0"); &error($speech{'46'}) unless(-e("$files/$FILE{'uploaddata02'}")); } if($FILE{'uploaddata03'} ne ""){ &error($speech{'45'}) if(-e("$files/$FILE{'uploaddata03'}")); open(F, "> $files/$FILE{'uploaddata03'}") || die ¬eerror($speech{'1'}, "$files/$FILE{'uploaddata03'}", $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata03'}; flock(F,8) if($flock); close(F); chmod(0777,"$absolutfile/$FILE{'uploaddata03'}") if($chmod eq "0"); &error($speech{'46'}) unless(-e("$files/$FILE{'uploaddata03'}")); } if($FILE{'uploaddata04'} ne ""){ &error($speech{'45'}) if(-e("$files/$FILE{'uploaddata04'}")); open(F, "> $files/$FILE{'uploaddata04'}") || die ¬eerror($speech{'1'}, "$files/$FILE{'uploaddata04'}", $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata04'}; flock(F,8) if($flock); close(F); chmod(0777,"$absolutfile/$FILE{'uploaddata04'}") if($chmod eq "0"); &error($speech{'46'}) unless(-e("$files/$FILE{'uploaddata04'}")); } if($FILE{'uploaddata05'} ne ""){ &error($speech{'45'}) if(-e("$files/$FILE{'uploaddata05'}")); open(F, "> $files/$FILE{'uploaddata05'}") || die ¬eerror($speech{'1'}, "$files/$FILE{'uploaddata05'}", $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata05'}; flock(F,8) if($flock); close(F); chmod(0777,"$absolutfile/$FILE{'uploaddata05'}") if($chmod eq "0"); &error($speech{'46'}) unless(-e("$files/$FILE{'uploaddata05'}")); } &adminshowuploadfiles($speech{'47'}); } # Ausgewählte Datei/en löschen sub admindeletefiles { &adminauthorization; &adminshowuploadfiles($speech{'54'}) if(scalar(split(/\,/, $FORM{'delete'})) eq "0"); foreach $i (split(/\,/, $FORM{'delete'})){ $i =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; if(-e("$files/$i")){ unlink("$files/$i"); }else{ &error($speech{'50'}); } } &adminshowuploadfiles($speech{'51'}); } # Newsletter Archiv anzeigen sub adminshowarchiv { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminarchiv.htm") || die ¬eerror($speech{'0'}, 'templates/adminarchiv.htm', $!); flock(F,2) if($flock); ($split, $split2, $split3) = split(// , (join("",))); flock(F,8) if($flock); close(F); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); $n = "0"; foreach $i (@archiv){ @data = split(/\|/, $i); $n++; $output .= $split2; $output =~ s/<_CGI>/$cgi/gi; $output =~ s/<_GRAFIK>/$graphics/gi; $output =~ s/<_ID>/&getauthorization/gie; $output =~ s/<_N>/$n/gi; &encode($data[6]); $output =~ s/<_NL>/$data[6]/gi; $bytes = length($data[8]); $kb = sprintf("%.3f", ($bytes / 1024)); $output =~ s/<_B>/$bytes/gi; $output =~ s/<_KB>/$kb/gi; $output =~ s/<_TIME>/$data[0]/gi; $output =~ s/<_FROM>/$data[5]/gi; } $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_M>/$msg/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_V>/$version/gi; $split3 =~ s/<_CGI>/$cgi/gi; $split3 =~ s/<_GRAFIK>/$graphics/gi; $split3 =~ s/<_ID>/&getauthorization/gie; $split3 =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &adminheader; print $split, $output, $split3; &footer; exit; } # Newsletter sortieren sub adminsortnewsletter { &adminauthorization; open(F, "templates/adminarchiv.htm") || die ¬eerror($speech{'0'}, 'templates/adminarchiv.htm', $!); flock(F,2) if($flock); ($split, $split2, $split3) = split(// , (join("",))); flock(F,8) if($flock); close(F); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); if($FORM{'sort'} eq "0"){ @archiv = sort{(split(/\|/, $a))[8] <=> (split(/\|/, $b))[8]} @archiv; }elsif($FORM{'sort'} eq "1"){ @archiv = sort{(split(/\|/, uc($a)))[6] cmp (split(/\|/, uc($b)))[6]} @archiv; }elsif($FORM{'sort'} eq "2"){ @archiv = sort{(split(/\|/, uc($b)))[6] cmp (split(/\|/, uc($a)))[6]} @archiv; }elsif($FORM{'sort'} eq "3"){ $i = @archiv; while ($i--){ $j = int(rand($i + 1)); @archiv[$i, $j] = @archiv[$j, $i]; } } foreach $i (@archiv){ @data = split(/\|/, $i); $n++; $output .= $split2; $output =~ s/<_CGI>/$cgi/gi; $output =~ s/<_GRAFIK>/$graphics/gi; $output =~ s/<_ID>/&getauthorization/gie; $output =~ s/<_N>/$n/gi; &encode($data[6]); $output =~ s/<_NL>/$data[6]/gi; $bytes = length($data[8]); $kb = sprintf("%.3f", ($bytes / 1024)); $output =~ s/<_B>/$bytes/gi; $output =~ s/<_KB>/$kb/gi; $output =~ s/<_TIME>/$data[0]/gi; $output =~ s/<_FROM>/$data[5]/gi; } $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_M>/$speech{'52'}/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_V>/$version/gi; $split3 =~ s/<_CGI>/$cgi/gi; $split3 =~ s/<_GRAFIK>/$graphics/gi; $split3 =~ s/<_ID>/&getauthorization/gie; $split3 =~ s/<_V>/$version/gi; print "Content-type: text/html\n\n"; &adminheader; print $split, $output, $split3; &footer; exit; } # Ausgewählte Newsletter löschen sub admindeletearchiv { &adminauthorization; &adminshowarchiv($speech{'54'}) if(scalar(split(/\,/, $FORM{'delete'})) eq "0"); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); $n = "0"; foreach $i (@archiv){ chomp($i); $y = "0"; foreach $z (sort{$a <=> $b} split(/\,/, $FORM{'delete'})){ if($n == ($z - 1)){ $y = "1"; last; } } $newarchiv .= "$i\n" unless($y); $n++; } open(F, "> data/archiv.txt") || die ¬eerror($speech{'1'}, 'data/archiv.txt', $!); flock(F,2) if($flock); print F $newarchiv; flock(F,8) if($flock); close(F); &adminshowarchiv($speech{'53'}); } # Newsletter anschauen sub adminviewnewsletter { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminviewnewsletter.htm") || die ¬eerror($speech{'0'}, 'templates/adminviewnewsletter.htm', $!); flock(F,2) if($flock); $newsletter = join("",); flock(F,8) if($flock); close(F); $newsletter =~ s/<_CGI>/$cgi/gi; $newsletter =~ s/<_GRAFIK>/$graphics/gi; $newsletter =~ s/<_ID>/&getauthorization/gie; $newsletter =~ s/<_V>/$version/gi; $newsletter =~ s/<_M>/$msg/gi; $newsletter =~ s/<_N>/$INFO{'nl'}/gi; $newsletter =~ m//gis; $content = $1; foreach $i (split(/, |,/, $email)){ $out .= $content; $out =~ s/<_EMAIL>/$i/gi; } $newsletter =~ s//$out/gis; $INFO{'n'} = "0" if($INFO{'n'} eq "last"); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = split(/\|/, (()[$INFO{'nl'} - 1])); flock(F,8) if($flock); close(F); $newsletter =~ s/<_DATE>/$archiv[0]/gi; $newsletter =~ s/<_IP>/$archiv[1]/gi; $kind = ($archiv[2]) ? "Text" : "HTML"; $newsletter =~ s/<_KIND>/$kind/gi; $set = ($archiv[3]) ? "UTF-8" : "ISO"; $newsletter =~ s/<_SET>/$set/gi; $newsletter =~ s/<_FILES>/$archiv[4]/gi; &encode($archiv[5]); $newsletter =~ s/<_FROM>/$archiv[5]/gi; &encode($archiv[6]); $newsletter =~ s/<_SUBJECT>/$archiv[6]/gi; print "Content-type: text/html\n\n"; &adminheader; print $newsletter; &footer; exit; } # Newsletter löschen sub admindeletenewsletter { &adminauthorization; open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); &adminviewnewsletter($speech{'55'}) if(@archiv < $INFO{'nl'}); $x = "0"; foreach $i (@archiv){ chomp($i); if($x == ($INFO{'nl'} - 1)){ next; }else{ $newarchiv .= "$i\n"; } $x++; } open(F, "> data/archiv.txt") || die ¬eerror($speech{'1'}, 'data/archiv.txt', $!); flock(F,2) if($flock); print F $newarchiv; flock(F,8) if($flock); close(F); &adminshowarchiv($speech{'56'}); } # Backup senden sub adminsendnewsletterbackup { &adminauthorization; open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = split(/\|/, (()[$INFO{'nl'} - 1])); flock(F,8) if($flock); close(F); if($FORM{'email2'} eq ""){ $useemail = $FORM{'email'}; }else{ $useemail = $FORM{'email2'}; } &adminviewnewsletter($speech{'57'}) if($useemail eq ""); &adminviewnewsletter($speech{'5'}) if(&validateemail($useemail)); $archiv[8] =~ s/<_EMAIL>/$useemail/gi; $archiv[8] =~ s/\[br\]/\n/g; if($howtosendemail == "0"){ &adminviewnewsletter($speech{'10'}) if($availablemailprog eq ""); open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M $archiv[8]; close(M); }else{ if($netsmtp){ $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or &writelogfile($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); $smtp->recipient($useemail); $smtp->data() or &writelogfile($speech{'14'}, $FORM{'email'}, $!); $smtp->datasend($archiv[8]); $smtp->dataend(); $smtp->quit(); }else{ &adminviewnewsletter($speech{'12'}); } } &adminviewnewsletter($speech{'58'}); } # E-Mail Header anschauen sub adminviewheader { &adminauthorization; open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = split(/\|/, (()[$INFO{'nl'} - 1])); flock(F,8) if($flock); close(F); &encode($archiv[8]); $archiv[8] =~ s/\[br\]/
/g; print "Content-type: text/html\n\n"; print $archiv[8]; exit; } # Newsletter ausgeben sub adminprintnewsletter { &adminauthorization; open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = split(/\|/, (()[$INFO{'nl'} - 1])); flock(F,8) if($flock); close(F); &encode($archiv[7]); $archiv[7] =~ s/\[br\]/
/g; print "Content-type: text/html\n\n"; print $archiv[7]; exit; } # Abonennten anzeigen sub adminshowemails { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminshowemails.htm") || die ¬eerror($speech{'0'}, 'templates/adminshowemails.htm', $!); flock(F,2) if($flock); $abonents = join("",); flock(F,8) if($flock); close(F); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); $allemails = join("",); flock(F,8) if($flock); close(F); $abonents =~ s/<_CGI>/$cgi/gi; $abonents =~ s/<_GRAFIK>/$graphics/gi; $abonents =~ s/<_ID>/&getauthorization/gie; $abonents =~ s/<_V>/$version/gi; $abonents =~ s/<_M>/$msg/gi; $abonents =~ s/<_EMAILS>/$allemails/gi; print "Content-type: text/html\n\n"; &adminheader; print $abonents; &footer; exit; } # E-Mails speichern sub adminsaveemails { &adminauthorization; $FORM{'emails'} =~ s/\r//g; foreach $i (split(/\n/, $FORM{'emails'})){ next if($i eq ""); @structur = split(/\|/, $i); &adminshowemails($speech{'59'}) if($structur[0] eq "" || $structur[1] eq "" || $structur[2] eq "" || $structur[3] eq ""); $i =~ s/^\[\d+\] //; $newemails .= "$i\n"; } open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); &adminshowemails($speech{'60'}); } # E-Mails sortieren sub adminsortemails { &adminauthorization; open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); if($FORM{'sort'} == "0"){ @emails = sort {(split(/\|/, $a))[0] cmp (split(/\|/, $b))[0]} @emails; }elsif($FORM{'sort'} == "1"){ @emails = sort {(split(/\|/, $b))[0] cmp (split(/\|/, $a))[0]} @emails; }elsif($FORM{'sort'} == "2"){ @emails = sort {(split(/\|/, $a))[1] <=> (split(/\|/, $b))[1]} @emails; }elsif($FORM{'sort'} == "3"){ $i = @emails; while ($i--){ $j = int(rand($i + 1)); @emails[$i, $j] = @emails[$j, $i]; } } open(F, "> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F for(@emails); flock(F,8) if($flock); close(F); &adminshowemails($speech{'61'}); } # Admin Statistik sub adminstatistik { &adminauthorization; open(F, "templates/adminstatistik.htm") || die ¬eerror($speech{'0'}, 'templates/adminstatistik.htm', $!); flock(F,2) if($flock); $statistik = join("",); flock(F,8) if($flock); close(F); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); foreach $i (@archiv){ chomp($i); $allnl++; @size = split(/\|/, $i); $size[8] =~ s/\[br\]/\n/gi; $size += length($size[8]); } @size = split(/\|/, $archiv[-1]); $size[8] =~ s/\[br\]/\n/gi; $lastsize = length($size[8]); foreach $i (@emails){ chomp($i); $allemails++; @data = split(/\|/, $i); $today++ if($data[1] > (time() - 86400)); $yesterday++ if($data[1] > (time() - 172800) && $data[1] < (time() - 86400)); $nc++ if($data[3] == "1" || $data[3] == "3"); } $allnl = "0" if($allnl eq ""); $size = "0" if($size eq ""); $lastsize = "0" if($lastsize eq ""); $allemails = "0" if($allemails eq ""); $today = "0" if($today eq ""); $yesterday = "0" if($yesterday eq ""); $nc = "0" if($nc eq ""); if($size == "0"){ $size2 = "0"; }else{ $size2 = sprintf("%.3f", ($size / 1024)); } if($lastsize == "0"){ $lastsize2 = "0"; }else{ $lastsize2 = sprintf("%.3f", ($lastsize / 1024)); } $statistik =~ s/<_CGI>/$cgi/gi; $statistik =~ s/<_GRAFIK>/$graphics/gi; $statistik =~ s/<_ID>/&getauthorization/gie; $statistik =~ s/<_V>/$version/gi; $statistik =~ s/<_M>/$speech{'29'}/gi; $statistik =~ s/<_ALL>/$allnl/gi; $statistik =~ s/<_SIZE>/$size/gi; $statistik =~ s/<_SIZE2>/$size2/gi; $statistik =~ s/<_LASTSIZE>/$lastsize/gi; $statistik =~ s/<_LASTSIZE2>/$lastsize2/gi; $statistik =~ s/<_EMAILS>/$allemails/gi; $statistik =~ s/<_DAY>/$today/gi; $statistik =~ s/<_YDAY>/$yesterday/gi; $statistik =~ s/<_NC>/$nc/gi; print "Content-type: text/html\n\n"; &adminheader; print $statistik; &footer; exit; } # HTML Code Seite ausgeben sub adminhtmlcode { &adminauthorization; $msg = shift || $speech{'29'}; $code = shift || ""; open(F, "templates/admingeneratecode.htm") || die ¬eerror($speech{'0'}, 'templates/admingeneratecode.htm', $!); flock(F,2) if($flock); $html = join("",); flock(F,8) if($flock); close(F); $html =~ s/<_CGI>/$cgi/gi; $html =~ s/<_GRAFIK>/$graphics/gi; $html =~ s/<_ID>/&getauthorization/gie; $html =~ s/<_V>/$version/gi; $html =~ s/<_M>/$msg/gi; $html =~ s/<_CODE>/$code/gi; print "Content-type: text/html\n\n"; &adminheader; print $html; &footer; exit; } # HTML Code generieren sub adminshowgeneratedcode { &adminauthorization; if($FORM{'modus'} == "0"){ $html = qq~~; }elsif($FORM{'modus'} == "1"){ $html = qq~~; }elsif($FORM{'modus'} eq "2"){ $html .= qq~Newsletter aufrufen~; }else{ $html = qq~~; }elsif($FORM{'window'} == "1"){ $html .= qq~>~; }else{ $html .= qq~ target="_top">~; } $html .= qq~Newsletter aufrufen~; } &adminhtmlcode($speech{'67'}, $html); } # Fehlermeldungen anzeigen sub adminshowerrors { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminerrors.htm") || die ¬eerror($speech{'0'}, 'templates/adminerrors.htm', $!); flock(F,2) if($flock); ($split , $split2 , $split3, $split4) = split(// , (join("",))); flock(F,8) if($flock); close(F); open(F, "data/errors.txt") || die ¬eerror($speech{'0'}, 'data/errors.txt', $!); flock(F,2) if($flock); @errors = split(/\- \- \- \- \- \- \- \- \- \-/, join("",)); flock(F,8) if($flock); close(F); $x = "0"; if(@errors == "0"){ $adminerrors = $split3; $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_V>/$version/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_M>/$msg/gi; }else{ foreach $i (@errors){ last if($i eq "\n"); $x++; $adminerrors .= $split2; $adminerrors =~ s/<_N>/$x/gi; $i =~ m/(.*?) \( .*? \).+/is; $message = $1; $message =~ s/^\n(.+)$/$1/g; $message =~ s/'/\\'/g; $message =~ s/"/\\'/g; $adminerrors =~ s/<_BM2>/$message/gi; $message =~ s/'/"/g; $message =~ s/\\//g; $adminerrors =~ s/<_BM>/$message/gi; $i =~ m/.*? \( .*? \)(.+)/is; $message = $1; $message =~ s/^\n(.+)\n$/$1/g; $message =~ s/'/\\'/g; $message =~ s/"/\\'/g; $adminerrors =~ s/<_SM2>/$message/gi; $message =~ s/'/"/g; $message =~ s/\\//g; $adminerrors =~ s/<_SM>/$message/gi; $i =~ m/.*? \( (.*?) \).+/is; $message = $1; $message =~ s/'/\\'/g; $message =~ s/"/\\'/g; $adminerrors =~ s/<_TS2>/$message/gi; $message =~ s/'/"/g; $message =~ s/\\//g; $adminerrors =~ s/<_TS>/$message/gi; $message = ""; } $split =~ s/<_CGI>/$cgi/gi; $split =~ s/<_GRAFIK>/$graphics/gi; $split =~ s/<_V>/$version/gi; $split =~ s/<_ID>/&getauthorization/gie; $split =~ s/<_M>/$msg/gi; } print "Content-type: text/html\n\n"; &adminheader; print $split, $adminerrors, $split4; &footer; exit; } # Fehlermeldungen löschen sub adminsaveerrors { &adminauthorization; &adminshowerrors($speech{'68'}) if(scalar(split(/\,/, $FORM{'delete'})) eq "0"); open(F, "data/errors.txt") || die ¬eerror($speech{'0'}, 'data/errors.txt', $!); flock(F,2) if($flock); @errors = split(/\- \- \- \- \- \- \- \- \- \-/, join("",)); flock(F,8) if($flock); close(F); $y = "0"; $x = "0"; foreach $i (@errors){ next if($i eq "\n"); $x++; foreach $a (split(/\,/, $FORM{'delete'})){ $y = "1" if($a == $x); } if($y != "1"){ $newerrors .= $i; $newerrors .= "- - - - - - - - - -"; } $y = "0"; } $newerrors .= "\n" if($newerrors ne ""); open(F, "> data/errors.txt") || die ¬eerror($speech{'1'}, 'data/errors.txt', $!); flock(F,2) if($flock); print F $newerrors; flock(F,8) if($flock); close(F); &adminshowerrors($speech{'69'}); } # Logfile anzeigen sub adminshowlogfile { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminshowlogfile.htm") || die ¬eerror($speech{'0'}, 'templates/adminshowfile.htm', $!); flock(F,2) if($flock); $logfile = join("",); flock(F,8) if($flock); close(F); open(F, "data/errors.txt") || die ¬eerror($speech{'0'}, 'data/errors.txt', $!); flock(F,2) if($flock); $errors = join("",); flock(F,8) if($flock); close(F); $logfile =~ s/<_CGI>/$cgi/gi; $logfile =~ s/<_GRAFIK>/$graphics/gi; $logfile =~ s/<_ID>/&getauthorization/gie; $logfile =~ s/<_V>/$version/gi; $logfile =~ s/<_M>/$msg/gi; $logfile =~ s/<_LOGFILE>/$errors/gi; print "Content-type: text/html\n\n"; &adminheader; print $logfile; &footer; exit; } # Logfile speichern sub adminsavelogfile { &adminauthorization; $FORM{'logfile'} =~ s/\r//g; foreach $i (split(/\n/, $FORM{'logfile'})){ next if($i eq ""); $i =~ s/^\[\d+\] //; $newlogfile .= "$i\n"; } open(F, "> data/errors.txt") || die ¬eerror($speech{'1'}, 'data/errors.txt', $!); flock(F,2) if($flock); print F $newlogfile; flock(F,8) if($flock); close(F); &adminshowlogfile($speech{'70'}); } # Dateien updaten sub adminupdatefiles { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminupdatefiles.htm") || die ¬eerror($speech{'0'}, 'templates/adminupdatefiles.htm', $!); flock(F,2) if($flock); $updatefiles = join("",); flock(F,8) if($flock); close(F); open(F, "data/archiv.txt") || die ¬eerror($speech{'0'}, 'data/archiv.txt', $!); flock(F,2) if($flock); @archiv = ; flock(F,8) if($flock); close(F); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @emails = ; flock(F,8) if($flock); close(F); open(F, "data/errors.txt") || die ¬eerror($speech{'0'}, 'data/errors.txt', $!); flock(F,2) if($flock); foreach $i (){ $errors++ if($i =~ m/^\- \- \-/); } flock(F,8) if($flock); close(F); open(F, "data/flood.txt") || die ¬eerror($speech{'0'}, 'data/flood.txt', $!); flock(F,2) if($flock); @flood = ; flock(F,8) if($flock); close(F); $updatefiles =~ s/<_CGI>/$cgi/gi; $updatefiles =~ s/<_GRAFIK>/$graphics/gi; $updatefiles =~ s/<_ID>/&getauthorization/gie; $updatefiles =~ s/<_V>/$version/gi; $updatefiles =~ s/<_M>/$msg/gi; $updatefiles =~ s/<_A1>/scalar(@archiv)/gie; $updatefiles =~ s/<_A2>/scalar(@emails)/gie; $updatefiles =~ s/<_A3>/$errors/gie; $updatefiles =~ s/<_A4>/scalar(@flood)/gie; print "Content-type: text/html\n\n"; &adminheader; print $updatefiles; &footer; exit; } # Dateien updaten sub adminsaveupdatefiles { &adminauthorization; open(F, "> data/$FORM{'file'}") || die ¬eerror($speech{'0'}, "data/$FORM{'file'}", $!); flock(F,2) if($flock); print F ""; flock(F,8) if($flock); close(F); &adminupdatefiles($speech{'71'}); } # Seite zum Laden der Templates anzeigen sub adminloadtemplate { &adminauthorization; $loaded = shift || $speech{'72'}; $template = shift || ""; $msg = shift || $speech{'29'}; open(F, "templates/admintemplate.htm") || die ¬eerror($speech{'0'}, 'templates/admintemplate.htm', $!); flock(F,2) if($flock); $temp = join("",); flock(F,8) if($flock); close(F); $temp =~ s/<_CGI>/$cgi/gi; $temp =~ s/<_GRAFIK>/$graphics/gi; $temp =~ s/<_V>/$version/gi; $temp =~ s/<_TEMPLATE>/$template/gi; $temp =~ s/<_LT>/$loaded/gi; $temp =~ s/<_M>/$msg/gi; $temp =~ s/<_ID>/&getauthorization/gie; print "Content-type: text/html\n\n"; &adminheader; print $temp; &footer; exit; } # Template laden und anzeigen sub adminviewtemplate { &adminauthorization; &adminloadtemplate($speech{'73'}) if($FORM{'template'} eq "" && $INFO{'file'} eq ""); $INFO{'file'} =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $INFO{'file'} = "data/$INFO{'file'}"; if($FORM{'template'} eq ""){ $template = $INFO{'file'}; }else{ $template = $FORM{'template'}; } open(F, "$template") || die ¬eerror($speech{'0'}, $template, $!); flock(F,2) if($flock); $tempdata = join("",); flock(F,8) if($flock); close(F); $tempdata =~ s/&/&/gsi; $tempdata =~ s//>/gsi; &adminloadtemplate($template, $tempdata, $speech{'74'}); } # Template speichern sub adminsavetemplate { &adminauthorization; &adminloadtemplate("","",$speech{'75'}) if($FORM{'datatemp'} eq $speech{'72'}); $FORM{'savetemp'} =~ s/\r//g; @lines = split(/\n/, $FORM{'savetemp'}); foreach $i (@lines){ $i =~ s/^\[\d+\] //; $template .= "$i\n"; } $template =~ s/^0//; open(F, "> $FORM{'datatemp'}") || die ¬eerror($speech{'1'}, "$FORM{'datatemp'}", $!); flock(F,2) if($flock); print F $template; flock(F,8) if($flock); close(F); &adminloadtemplate($FORM{'datatemp'}, $template, $speech{'76'}); } # Sprachdatei anzeigen sub adminloadspeech { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminspeech.htm") || die ¬eerror($speech{'0'}, 'templates/adminspeech.htm', $!); flock(F,2) if($flock); $speechtemp = join("",); flock(F,8) if($flock); close(F); open(F, "data/speech.txt") || die ¬eerror($speech{'0'}, 'data/speech.txt', $!); flock(F,2) if($flock); $speech = join("",); flock(F,8) if($flock); close(F); $speechtemp =~ s/<_CGI>/$cgi/gi; $speechtemp =~ s/<_GRAFIK>/$graphics/gi; $speechtemp =~ s/<_ID>/&getauthorization/gie; $speechtemp =~ s/<_V>/$version/gi; $speechtemp =~ s/<_M>/$msg/gi; $speechtemp =~ s/<_SPEECH>/$speech/gi; print "Content-type: text/html\n\n"; &adminheader; print $speechtemp; &footer; exit; } # Sprachdatei speichern sub adminsavespeech { &adminauthorization; $FORM{'speech'} =~ s/\r//g; foreach $i (split(/\n/, $FORM{'speech'})){ next if($i eq ""); $i =~ s/^\[\d+\] //; $newspeech .= "$i\n"; } open(F, "> data/speech.txt") || die ¬eerror($speech{'1'}, 'data/speech.txt', $!); flock(F,2) if($flock); print F $newspeech; flock(F,8) if($flock); close(F); &adminloadspeech($speech{'77'}); } # Konfigurationsbeschreibung anzeigen sub adminshowconfig { &adminauthorization; open(F, "data/configdescription.txt") || die ¬eerror($speech{'0'}, 'data/configdescription.txt', $!); flock(F,2) if($flock); $config = join("",); flock(F,8) if($flock); close(F); $config =~ s/[\n\r]/
\n/g; print "Content-type: text/html\n\n"; print $config; exit; } # Backup der E-Mail Liste erstellen sub adminbackup { &adminauthorization; open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); $emaillist = join("",); flock(F,8) if($flock); close(F); if($howtosendemail == "0"){ &adminshow($speech{'10'}) if($availablemailprog eq ""); $to .= "$_; " foreach(split(/\, |\,/, $email)); $to =~ s/; $//; open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M "To: $to\n"; print M "From: backup\@ebnewsletter.de\n"; print M "X-Priority: 3 (Normal)\n"; print M "X-Mailer: EBNewsLetter $version\n"; if($ENV{'REMOTE_ADDR'}){ print M "X-IP: $ENV{'REMOTE_ADDR'}\n"; }else{ print M "X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"; } print M "MIME-Version: 1.0\n"; print M "Subject: [E-Mail Listen Backup]\n"; $boundary = &generate_boundary; print M "Content-type: multipart/mixed; boundary=\"$boundary\"\n"; print M "\n--$boundary\n"; print M "Content-type: text/plain\n"; print M "Content-Transfer-Encoding: 7bit\n"; print M "\nHallo!\nDas angeforderte Backup der E-Mail Liste befindet sich in der Datei \"emails.txt\" im Dateianhang.\n\nViel Erfolg!\n"; print M "\n--$boundary\n"; print M "Content-type: text/plain; name=\"emails.txt\"\n"; print M "Content-Transfer-Encoding: base64\n"; print M "Content-Disposition: attachment; filename=\"emails.txt\"\n\n"; $attachment .= &encodebase64($emaillist); print M "$attachment\n"; print M "\n--$boundary"; close(M); }else{ if($netsmtp){ $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or die ¬eerror($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); push(@to, $_) foreach(split(/\, |\,/, $email)); $smtp->recipient(@to); $smtp->data() or die ¬eerror($speech{'14'}, $mailhost, $!); $smtp->datasend("From: backup\@ebnewsletter.de\n"); $smtp->datasend("X-Priority: 3 (Normal)\n"); $smtp->datasend("X-Mailer: EBNewsLetter $version\n"); if($ENV{'REMOTE_ADDR'}){ $smtp->datasend("X-IP: $ENV{'REMOTE_ADDR'}\n"); }else{ $smtp->datasend("X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"); } $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Subject: [E-Mail Listen Backup]\n"); $boundary = &generate_boundary; $smtp->datasend("Content-type: multipart/mixed; boundary=\"$boundary\"\n"); $smtp->datasend("\n--$boundary\n"); $smtp->datasend("Content-type: text/plain\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("\nHallo!\nDas angeforderte Backup der E-Mail Liste befindet sich in der Datei \"emails.txt\" im Dateianhang.\n\nViel Erfolg!\n"); $smtp->datasend("\n--$boundary\n"); $smtp->datasend("Content-type: text/plain; name=\"emails.txt\"\n"); $smtp->datasend("Content-Transfer-Encoding: base64\n"); $smtp->datasend("Content-Disposition: attachment; filename=\"emails.txt\"\n\n"); $attachment .= &encodebase64($emaillist); $smtp->datasend("$attachment\n"); $smtp->datasend("\n--$boundary"); $smtp->dataend(); $smtp->quit(); }else{ &adminshow($speech{'12'}); } } &adminshow($speech{'78'}); } # E-Mail Programm testen sub adminemailtest { &adminauthorization; if($howtosendemail == "0"){ &adminshow($speech{'10'}) if($availablemailprog eq ""); $to .= "$_; " foreach(split(/\, |\,/, $email)); $to =~ s/; $//; open(M, "|$availablemailprog -t") || die ¬eerror($speech{'11'}, $availablemailprog, $!); print M "To: $to\n"; print M "From: test\@ebnewsletter.de\n"; print M "X-Priority: 3 (Normal)\n"; print M "X-Mailer: EBNewsLetter $version\n"; if($ENV{'REMOTE_ADDR'}){ print M "X-IP: $ENV{'REMOTE_ADDR'}\n"; }else{ print M "X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"; } print M "MIME-Version: 1.0\n"; print M "Subject: [E-Mail Test erfolgreich!]\n"; print M "Content-type: text/plain\n\n"; print M "Wenn Sie diese E-Mail lesen, war der E-Mail Test des EBNewsLetters erfolgreich!\nHerzlichen Glueckwunsch!"; close(M); }else{ if($netsmtp){ $smtp = Net::SMTP_auth->new($mailhost, Timeout => $timeoutsmtp) or die ¬eerror($speech{'13'}, $mailhost, $!); $smtppasswd =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $smtp->auth('CRAM-MD5', $smtpuser, $smtppasswd); $smtp->mail($ENV{'USER'}); push(@to, $_) foreach(split(/\, |\,/, $email)); $smtp->recipient(@to); $smtp->data() or die ¬eerror($speech{'14'}, $mailhost, $!); $smtp->datasend("From: test\@ebnewsletter.de\n"); $smtp->datasend("X-Priority: 3 (Normal)\n"); $smtp->datasend("X-Mailer: EBNewsLetter $version\n"); if($ENV{'REMOTE_ADDR'}){ $smtp->datasend("X-IP: $ENV{'REMOTE_ADDR'}\n"); }else{ $smtp->datasend("X-IP Proxy: $ENV{'HTTP_X_FORWARDED_FOR'}\n"); } $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Subject: [E-Mail Test erfolgreich!]\n"); $smtp->datasend("Content-type: text/plain\n\n"); $smtp->datasend("Wenn Sie diese E-Mail lesen, war der E-Mail Test des EBNewsLetters erfolgreich!\nHerzlichen Glueckwunsch!"); $smtp->dataend(); $smtp->quit(); }else{ &adminshow($speech{'79'}); } } &adminshow($speech{'80'}); } # E-Mail Adressen importieren sub adminshowimportemails { &adminauthorization; $msg = shift || $speech{'29'}; open(F, "templates/adminimportemails.htm") || die ¬eerror($speech{'0'}, 'templates/adminimportemails.htm', $!); flock(F,2) if($flock); $import = join("",); flock(F,8) if($flock); close(F); $import =~ s/<_CGI>/$cgi/gi; $import =~ s/<_GRAFIK>/$graphics/gi; $import =~ s/<_ID>/&getauthorization/gie; $import =~ s/<_V>/$version/gi; $import =~ s/<_M>/$msg/gi; $import =~ s/<_SPEECH>/$speech/gi; print "Content-type: text/html\n\n"; &adminheader; print $import; &footer; exit; } # E-Mail Adressen speichern sub adminsaveimportedmails { &adminauthorization; $FORM{'emails'} =~ s/\r//g; foreach $i (split(/\n/, $FORM{'emails'})){ next if($i eq ""); &adminshowimportemails($speech{'110'}) if($i !~ m/^.+\@.+\.\w+$/); $i =~ s/^\[\d+\] //; $newemails .= "$i\|$time\|127.0.0.1\|0\n"; } open(F, ">> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); &adminshowimportemails($speech{'111'}); } # E-Mail Adressen uploaden sub adminuploadimportedmails { &adminauthorization; &adminshowimportemails($speech{'112'}) if($FILE{'uploaddata01'} eq ""); open(F, "> data/import.txt") || die ¬eerror($speech{'1'}, 'data/import.txt', $!); flock(F,2) if($flock); binmode(F); print F $FORM{'uploaddata01'}; flock(F,8) if($flock); close(F); open(F, "data/import.txt") || die ¬eerror($speech{'0'}, 'data/import.txt', $!); flock(F,2) if($flock); @imported = ; flock(F,8) if($flock); close(F); foreach $i (@imported){ chomp($i); next if($i eq ""); if($i !~ m/^.+\@.+\.\w+$/){ unlink("data/import.txt"); &adminshowimportemails($speech{'113'}); } $newemails .= "$i\|$time\|127.0.0.1\|0\n"; } open(F, ">> data/emails.txt") || die ¬eerror($speech{'1'}, 'data/emails.txt', $!); flock(F,2) if($flock); print F $newemails; flock(F,8) if($flock); close(F); unlink("data/import.txt"); &adminshowimportemails($speech{'111'}); } # E-Mails exportieren sub adminshowexportmails { &adminauthorization; open(F, "templates/adminexportemails.htm") || die ¬eerror($speech{'0'}, 'templates/adminexportemails.htm', $!); flock(F,2) if($flock); $export = join("",); flock(F,8) if($flock); close(F); open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @export = ; flock(F,8) if($flock); close(F); foreach $i (@export){ @structur = split(/\|/, $i); $newemails .= "$structur[0]\n"; } $export =~ s/<_CGI>/$cgi/gi; $export =~ s/<_GRAFIK>/$graphics/gi; $export =~ s/<_ID>/&getauthorization/gie; $export =~ s/<_V>/$version/gi; $export =~ s/<_M>/$speech{'29'}/gi; $export =~ s/<_SPEECH>/$speech/gi; $export =~ s/<_EMAILS>/$newemails/gi; print "Content-type: text/html\n\n"; &adminheader; print $export; &footer; exit; } # E-Mails herunterladen sub admindownloadmails { &adminauthorization; open(F, "data/emails.txt") || die ¬eerror($speech{'0'}, 'data/emails.txt', $!); flock(F,2) if($flock); @export = ; flock(F,8) if($flock); close(F); foreach $i (@export){ @structur = split(/\|/, $i); $newemails .= "$structur[0]\n"; } print "Content-Type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=emails.txt;\n\n"; print $newemails; exit; } # Eingaben kodieren sub encode { $_[0] =~ s//>/gs; $_[0] =~ s/ö/ö/gs; $_[0] =~ s/ä/ä/gs; $_[0] =~ s/ü/ü/gs; $_[0] =~ s/Ö/Ö/gs; $_[0] =~ s/Ä/Ä/gs; $_[0] =~ s/Ü/Ü/gs; $_[0] =~ s/[\n\r]/\[br\]/gs; $_[0] =~ s/ß/ß/gs; $_[0] =~ s/\|/\|/gs; $_[0] =~ s/\"/"/gs; $_[0] =~ s/\@/&\#064;/gs; } # Log File schreiben sub writelogfile { ($msg, $mail, $server) = @_; $server ||= "No errors recognized!"; $success = "0"; open(F, ">> data/errors.txt"); flock(F,2) if($flock); print F "$msg \"$mail\"! ( $zeit )\n$server\n- - - - - - - - - -\n"; flock(F,8) if($flock); close(F); } # Prüfen, ob Benutzer authorisiert ist sub adminauthorization { if($sid eq "0"){ if($INFO{'id'} eq ""){ $FORM{'pass'} = unpack("H*", $FORM{'pass'}) if($FORM{'pass'} ne ""); $FORM{'user'} = unpack("H*", $FORM{'user'}) if($FORM{'user'} ne ""); &error($speech{'27'}) if($INFO{'id'} eq "" && $FORM{'user'} eq ""); &error($speech{'28'}) if($INFO{'id'} eq "" && $FORM{'pass'} eq ""); if($FORM{'pass'} eq $adminpassword){ $x = "0"; foreach $i (split(/, |,/, $adminname)){ $x = "1" if($i eq $FORM{'user'}); } &error($speech{'25'}) if($x == "0"); }else{ &error($speech{'25'}); } @sid = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9); foreach $i (1..10){ $generated .= $sid[int(rand($#sid + 1))]; } $time = time() + $stimeout; open(F, ">> data/sid.txt") || die ¬eerror($speech{'1'}, 'data/sid.txt', $!); flock(F,2) if($flock); print F "$time\|$generated\n"; flock(F,8) if($flock); close(F); }else{ open(F, "data/sid.txt") || die ¬eerror($speech{'0'}, 'data/sid.txt', $!); flock(F,2) if($flock); @sid = ; flock(F,8) if($flock); close(F); $time = time(); foreach $i (@sid){ chomp($i); ($ts, $session) = split(/\|/, $i); if($session eq $INFO{'id'}){ if($ts < $time){ $e = "1"; }else{ $newtime = $time + $stimeout; $new .= "$newtime\|$session\n"; } $auth = "2"; }else{ if($ts > $time){ $new .= "$i\n"; } } } open(F, "> data/sid.txt") || die ¬eerror($speech{'1'}, 'data/sid.txt', $!); flock(F,2) if($flock); print F $new; flock(F,8) if($flock); close(F); if($e == "1"){ &error($speech{'44'}); }elsif($auth != "2"){ &error($speech{'25'}); } } }else{ $FORM{'pass'} = unpack("H*", $FORM{'pass'}) if($FORM{'pass'} ne ""); $FORM{'user'} = unpack("H*", $FORM{'user'}) if($FORM{'user'} ne ""); &error($speech{'27'}) if($INFO{'id'} eq "" && $FORM{'user'} eq ""); &error($speech{'28'}) if($INFO{'id'} eq "" && $FORM{'pass'} eq ""); if($FORM{'pass'} eq "" && $INFO{'id'} ne $adminpassword){ &error($speech{'25'}); }else{ if($INFO{'id'} ne $adminpassword){ $x = "0"; foreach $i (split(/, |,/, $adminname)){ $x = "1" if($i eq $FORM{'user'}); } &error($speech{'25'}) if($x == "0" || $FORM{'pass'} ne $adminpassword); } } } } # Authorisationsmethode ermitteln sub getauthorization { if($sid == "0"){ if($INFO{'id'} ne ""){ return $INFO{'id'}; }else{ return $generated; } }else{ if($INFO{'id'} ne ""){ return $INFO{'id'}; }else{ return $adminpassword; } } } # Admin Logout sub adminlogout { &adminauthorization; if($sid == "0"){ open(F, "data/sid.txt") || die ¬eerror($speech{'0'}, 'data/sid.txt', $!); flock(F,2) if($flock); @sid = ; flock(F,8) if($flock); close(F); foreach $i (@sid){ chomp($i); ($ts, $sessionid) = split(/\|/, $i); $newsid .= "$i\n" if($sessionid ne $INFO{'id'}); } open(F, "> data/sid.txt") || die ¬eerror($speech{'1'}, 'data/sid.txt', $!); flock(F,2) if($flock); print F $newsid; flock(F,8) if($flock); close(F); print "Location: $cgi/ebnewsletter.cgi?action=admin&do=login\n\n"; }else{ print "Location: $cgi/ebnewsletter.cgi?action=admin&do=login\n\n"; } exit; } # Fehlermeldung ausgeben sub error { $msg = shift; open(F, "templates/error.htm") || die ¬eerror($speech{'0'}, 'templates/error.htm', $!); flock(F,2) if($flock); $error = join("",); flock(F,8) if($flock); close(F); $error =~ s/<_ERROR>/$msg/gi; $error =~ s/<_CGI>/$cgi/gi; $error =~ s/<_V>/$version/gi; print "Content-type:text/html\n\n"; &header; print $error; &footer; exit; } # Fehler im Script notieren sub noteerror { ($msg, $file, $servermsg) = @_; $servermsg ||= "No errors recognized!"; open(F, ">> data/errors.txt") || die "Can't open data: 'data/errors.txt'!\n$!"; flock(F,2) if($flock); print F "$msg \"$file\"! ( $zeit )\n$servermsg\n- - - - - - - - - -\n"; flock(F,8) if($flock); close(F); $query = ($ENV{'QUERY_STRING'}) ? "'$ENV{'QUERY_STRING'}'" : "No Query String available!"; $ua = ($ENV{'HTTP_USER_AGENT'}) ? "'$ENV{'HTTP_USER_AGENT'}'" : "No User Agent found!"; $html = qq~ EBNewsLetter - Fehler / Error!
Fehler / Error!

Ihre Eingaben haben einen Fehler im Newsletterscript ausgelöst!
Bitte teilen Sie dies unverzüglich dem Administrator mit!

Verwenden Sie zur Mitteilung diesen Problembericht:



Schicken Sie diese Nachricht bitte an:


$pemail


Vielen Dank!



EBNewsLetter v.$version
(c) Copyright by Erik Bertram, 2004
http://www.cgi-world.de
~; $html =~ s/\t{3}//gs; print "Content-type: text/html\n\n"; print $html; exit; } # Header wird ausgegeben sub header { open(F, "templates/header.htm") || die ¬eerror($speech{'0'}, 'templates/header.htm', $!); flock(F,2) if($flock); $header = join("",); flock(F,8) if($flock); close(F); $header =~ s/<_CGI>/$cgi/gi; $header =~ s/<_GRAFIK>/$graphics/gi; $header =~ s/<_V>/$version/gi; print $header; } # Header wird ausgegeben sub adminheader { open(F, "templates/header.htm") || die ¬eerror($speech{'0'}, 'templates/header.htm', $!); flock(F,2) if($flock); $header = join("",); flock(F,8) if($flock); close(F); open(F, "templates/adminheader.htm") || die ¬eerror($speech{'0'}, 'templates/adminheader.htm', $!); flock(F,2) if($flock); $header .= join("",); flock(F,8) if($flock); close(F); $header =~ s/<_CGI>/$cgi/gi; $header =~ s/<_GRAFIK>/$graphics/gi; $hexversion = unpack("H*", $version); $header =~ s/<_HV>/$hexversion/gi; $header =~ s/<_V>/$version/gi; $header =~ s/<_ID>/&getauthorization/gie; $header =~ s/<_SERVER>/$server/gi; print $header; } # Footer wird ausgegeben sub footer { open(F, "templates/footer.htm") || die ¬eerror($speech{'0'}, 'templates/footer.htm', $!); flock(F,2) if($flock); $footer = join("",); flock(F,8) if($flock); close(F); $footer =~ s/<_CGI>/$cgi/gi; $footer =~ s/<_GRAFIK>/$graphics/gi; $footer =~ s/<_EMAIL>/$pemail/gi; $footer =~ s/<_V>/$version/gi; &showindex; print $footer; } # Startseite vorbereiten sub showindex { $he85jxd='0a3c63656e7465723e0a20203c6120687265663d22687474703a2f2f7777772e6367692d776f726c642e646522207461726765743d225f626c616e6b223e3c696d67207372633d223c5f47524146494b3e2f636f70792e6769662220626f726465723d2230222077696474683d2231333022206865696768743d2231382220616c743d2245424e6577734c65747465722e312e30202d2028632920436f70797269676874206279204572696b204265727472616d223e3c2f613e3c62723e0a20203c646976207374796c653d22666f6e742d73697a653a203970783b20666f6e742d66616d696c793a2056657264616e612c20417269616c3b223e45424e6577734c65747465722e312e31202d203c6120687265663d22687474703a2f2f7777772e6367692d776f726c642e646522207461726765743d225f626c616e6b223e4347492d576f726c642e64653c2f613e3c62723e286329206279204572696b204265727472616d2c20323030343c2f6469763e0a3c2f63656e7465723e0a3c2f626f64793e0a3c2f68746d6c3e0a';$he85jxd=~s'([a-fA-F0-9]{2})'pack("C", hex($1))'eg;$footer.=$he85jxd;$footer=~s=<_GRAFIK>=$graphics=gi; }