#! /usr/bin/perl -w
#
# Dateiname: k001de.pl

$Startseite = "k001de.pl";

# Autor: manuel euer
#
# Das Script erzeugt die Login-fehlgeschlagen-Seite sowie die Login-erfolgreich-Seite
# Bei Login-erfolgreich wird die erste Session-ID erzeugt

# Perlmodule:
use CGI;
use DBI;

# Eigene Module:
require 'k000xx.pm';

# Enthält Prozeduren und Dateipfade

# Erzeugen eines neuen CGI-Objektes:
my $query = new CGI;

# Einlesen und Verarbeiten der übergebenen Parameter:

$Benutzer = &zeichen($query->param('formularBenutzer'));
$Passwort = &zeichen($query->param('formularPasswort'));
$SessionID = &zeichen($query->param('formularSessionID'));
$IPAdresse = &zeichen($query->remote_host());

# HTML-Templates definieren:

my ($StandardLoginTemplate,
  $StandardLoginEinleitungTemplate,
  $StandardLoginFehlgeschlagenTemplate,
  $StandardLoginTimeoutTemplate,
  $StandardLoginFormularTemplate,
  $StandardEingeloggtEinleitungTemplate,
  $StandardEingeloggtFormularTemplate);
    
$StandardLoginTemplate = "/k001de.htt";
$StandardLoginEinleitungTemplate = "/k002de.htt";
$StandardLoginFehlgeschlagenTemplate = "/k003de.htt";
$StandardLoginTimeoutTemplate = "/k004de.htt";
$StandardLoginFormularTemplate = "/k008de.htt";
$StandardEingeloggtEinleitungTemplate = "/k005de.htt";
$StandardEingeloggtFormularTemplate = "/k009de.htt";
        
#http-Header ausgeben:
print $query->header     (  -type=>'text/html',
                -expires=>'+1h'  );

#Datenbankverbindung definieren:
my $dbh = DBI->connect ('dbi:mysql:' . $kundenbereichdb,$kundenbereichuser,$kundenbereichpwd) || goto datenbankfehler;

if (($Benutzer ne "") || ($SessionID ne ""))
{
  $BenutzerPruefen=$dbh->prepare("select id, kunde, benutzer, passwort, lesen, loeschen from user where benutzer='$Benutzer' and passwort= '$Passwort'") || goto abfragefehler;
  $returncode=$BenutzerPruefen->execute || die "kann Abfrage nicht ausfuehren\n";
  while (my @BenutzerPruefenArray=$BenutzerPruefen->fetchrow_array)
  {
    $UID = $BenutzerPruefenArray[0];
  }
  $ausgabe = &schreiben($StandardLoginTemplate);
  
  if ($returncode==0)
  {
    $LoginDatenHolen=$dbh->prepare("select UNIX_TIMESTAMP() - UNIX_TIMESTAMP(letztezeit), ip from session where sid='$SessionID'") || goto abfragefehler;
    $sessioncode=$LoginDatenHolen->execute || die "kann Abfrage nicht ausfuehren\n";
    if ($sessioncode==0)
    {
      $ausgabe = &schreiben($StandardLoginFehlgeschlagenTemplate);
      $ausgabe = &schreiben($StandardLoginFormularTemplate);
    }
    else
    {
      while (my @LoginDatenHolenArray=$LoginDatenHolen->fetchrow_array)
      {
        $LoginZeit = $LoginDatenHolenArray[0];
        $LoginIP = $LoginDatenHolenArray[1];
      }
      if (($LoginZeit <= $zeitlimit) && ($LoginIP == $IPAdresse))
      {
        $BenutzerHolen=$dbh->prepare("select benutzer from user, session where user.id=session.uid and session.sid='$SessionID'") || goto abfragefehler;
        $BenutzerHolen->execute || die "kann Abfrage nicht ausfuehren\n";
        while (my @BenutzerHolenArray=$BenutzerHolen->fetchrow_array)
        {
          $Benutzer = $BenutzerHolenArray[0];
        }
        my $SessionIDErneuern=$dbh->prepare("update session set letztezeit=NOW() where sid='$SessionID'") || goto abfragefehler;
        $SessionIDErneuern->execute || die "kann Eintrag nicht ausfuehren\n";
        goto standardausgabe;
      }
      else
      {
        $LeerlaufMinuten = $zeitlimit / 60;
        $ausgabe = &schreiben($StandardLoginTimeoutTemplate);
        $ausgabe = &schreiben($StandardLoginFormularTemplate);
      }
    }
  }
  else
  {
    my $SessionIDSchreiben=$dbh->prepare("insert into session (uid,ip,letztezeit) values ('$UID','$IPAdresse',NOW())") || goto abfragefehler;
    $SessionIDSchreiben->execute || die "kann Eintrag nicht ausfuehren\n";
    $SessionIDHolen=$dbh->prepare("select MAX(sid) from session where uid='$UID'") || goto abfragefehler;
    $SessionIDHolen->execute || die "kann Abfrage nicht ausfuehren\n";
    while (my @SessionIDHolenArray=$SessionIDHolen->fetchrow_array)
    {
      $SessionID = $SessionIDHolenArray[0];
    }
    standardausgabe:
    {
      $BenutzerpfadHolen=$dbh->prepare("select kunde, pfad from user where benutzer='$Benutzer'") || goto abfragefehler;
      $BenutzerpfadHolen->execute || die "kann Abfrage nicht ausfuehren\n";
      while (my @BenutzerpfadHolenArray=$BenutzerpfadHolen->fetchrow_array)
      {
        $Benutzerkonto = $BenutzerpfadHolenArray[0];
        $Benutzerpfad = $BenutzerpfadHolenArray[1];
      }
      my $Verzeichnis = "/kunden/78209_10405/kundendaten/" . $Benutzerpfad . "/home";
      opendir(DIR, $Verzeichnis) || die "$Verzeichnis: $!";
      my @Dateien = readdir(DIR);
      closedir(DIR);
      $AnzahlDateien = @Dateien - 2;
      $ausgabe = &schreiben($StandardEingeloggtEinleitungTemplate);

      my $Verzeichnis = "/kunden/78209_10405/kundendaten/" . $Benutzerpfad . "/service";
      opendir(DIR, $Verzeichnis) || die "$Verzeichnis: $!";
      my @DateiNamen = readdir(DIR);
      closedir(DIR);
      
      $AnzahlDateien = @DateiNamen - 2;
      my @Dateien;
      for (my $i = 0; $i < @DateiNamen; $i++)
      {
        $Dateien[$i][0] = $DateiNamen[$i];
        $Dateien[$i][1] = "";
        $Dateien[$i][2] = "";
        $Dateien[$i][3] = "";
        $Dateien[$i][4] = "";
        $Dateien[$i][5] = "";
      }
      print "<form name=\"formular1\" action=\"k031de.pl\"  method=\"post\" enctype=\" multipart/form-data\">\n";
      print "  <input type=\"hidden\" id=\"formularSessionID\" name=\"formularSessionID\" value=\"$SessionID\"></form>\n";
      print "    <div class=\"neuheitenListe\" id=\"meineDateienListe\"  onFocus=\"this.blur();\">\n";
      print "    <div class=\"neuheitenSpalte\" id=\"serviceSpalte\"  onFocus=\"this.blur();\">\n";
      for (my $i = 0; $i < @Dateien; $i++)
      {
        if ($Dateien[$i][0] =~ /\b\.+.*/) 
        {
          my  $Datei= $Verzeichnis . "/" . $Dateien[$i][0];
          my @Info = stat($Datei);
          my $Dateizeit = int($Info[9]);
          my $Jetztzeit = time();
          $Dateien[$i][5] = $Dateizeit - (time() - ($neuheitenzeitraum * 3600 * 24));
          $Dateidatum = &datum($Dateizeit);
          $Dateien[$i][1] = $Dateidatum;
          $Dateien[$i][2] = $Dateizeit;
          my $Dateigroesse = int($Info[7]/1024)+1;
          my $DateigroesseEinheit;
          if ($Dateigroesse <1024)
          {
            $DateigroesseEinheit = "KB";
          }
          else
          {
            $Dateigroesse = int($Dateigroesse/1024) . "," . int((($Dateigroesse - int($Dateigroesse/1024)*1000) / 1.024)/10);
            $DateigroesseEinheit = "MB";
          }
        $Dateien[$i][3] = $Dateigroesse;
        $Dateien[$i][4] = $DateigroesseEinheit;
        }
      }
	  my $DateienZaehler=1;
      @Dateien = sort { $b->[2] <=> $a->[2] } @Dateien;
      for (my $i = 0; $i < @Dateien; $i++)
      {
        if (($Dateien[$i][0] =~ /\b\.+.*/) && ($Dateien[$i][5] >=0))
        {
          $DateienZaehler=$DateienZaehler+1;
          print " <a href=\"javascript:document.formular" . $DateienZaehler . ".submit()\"  onFocus=\"this.blur();\">$Dateien[$i][0]</a>&nbsp;($Dateien[$i][1],&nbsp;$Dateien[$i][3]&nbsp;$Dateien[$i][4])&nbsp;<br>\n";
        }
      }
      if ($DateienZaehler==1)
      {
        print "Derzeit keine neuen Dateien.\n";
      }
	  print "    </div></div>\n";
      my $DateienZaehler=1;
      for (my $i = 0; $i < @Dateien; $i++)
      {
        if (($Dateien[$i][0] =~ /\b\.+.*/) && ($Dateien[$i][5] >=0))
        {
          $Dateiendung=$Dateien[$i][0];
          $Dateiendung =~ s/.*\.//g;
          $MimetypHolen=$dbh->prepare("select inline from mimetypes where erweiterung='$Dateiendung'") || goto abfragefehler;
          $MimetypHolen->execute || die "kann Abfrage nicht ausfuehren\n";
          $Inline=0;
          while (my @MimetypHolenArray=$MimetypHolen->fetchrow_array)
          {
            $Inline = $MimetypHolenArray[0];
          }
          $DateienZaehler=$DateienZaehler+1;
          print "<form name=\"formular" . $DateienZaehler . "\" action=\"k023de.pl/$Dateien[$i][0]\" method=\"post\" enctype=\" multipart/form-data\"";
          if ($Inline == 1)
          {
            print "target=\"_blank\"";
          }
          print ">";
          print "<input type=\"hidden\" id=\"formularSessionID\" name=\"formularSessionID\" value=\"$SessionID\">";
          print "<input type=\"hidden\" id=\"formularDateiname\" name=\"formularDateiname\" value=\"$_\">";
          print "<input type=\"hidden\" id=\"formularDateipfad\" name=\"formularDateipfad\" value=\"service\">";
          print "</form>\n";
        }
      }
      $ausgabe = &schreiben($StandardEingeloggtFormularTemplate);
    }
  }
}
else
{
  $ausgabe = &schreiben($StandardLoginTemplate);
  $ausgabe = &schreiben($StandardLoginEinleitungTemplate);
  $ausgabe = &schreiben($StandardLoginFormularTemplate);
}
  
# Datenbank-Handles freigeben und Datenbankverbindung schlieşen:

$dbh->disconnect;

# Fehlerbehandlung:
goto ende;
dateifehler:{print "<font face='arial,geneva,helvetica' size='2'>Fehler: Die Vorlagendatei konnte nicht ge&ouml;ffnet werden.</font>";goto ende;}
datenbankfehler:{print "<font face='arial,geneva,helvetica' size='2'>Fehler: Konnte keine Verbindung zum Datenbankserver herstellen.</font>";goto ende;}
abfragefehler:{print "<font face='arial,geneva,helvetica' size='2'>Fehler: Die Datenbankabfrage konnte nicht ausgef&uuml;hrt werden. " . $Abfrage . "</font>";goto ende;}
ende:
