#!/usr/bin/perl
#######################################################################################################
#                                                                                                     #
#            "prosoz.pl" - Grunddatei auf dem Webserver für die eGovernment-Funktionalität            #
#                                                                                                     #
#                                      © 2003 PROSOZ Herten GmbH                                      #
#                                                                                                     #
#                            !!! Diese Datei darf nicht verändert werden !!!                          #
#                                                                                                     #
#######################################################################################################

use CGI;
use CGI::Carp "fatalsToBrowser";

###################
$iss = "";        # Der Pfad auf dem ISS (incl "/" am Ende)
###################

use lib $iss."module";								# Erweitern der @INC-Liste um das Modul-Verzeichnis
use PConfig;									# Modul mit Konfiguration einbinden
use Pallg;									# Modul mit allgemeinen Fkt. einbinden
use XMLServ;									# Modul für XML-Service-Fkt. einbinden

$sn = $ENV{"SCRIPT_NAME"};

$ua = $ENV{"HTTP_USER_AGENT"};							# Prüfen, ob der Browser auf einem PDA läuft
$Pallg::pda = 0;
if($ua =~ /Windows CE/)
{
  $Pallg::pda = 1;
}

$h = new CGI;									# Übergabeparameter auslesen
$act = $h->param("act");
$sid = $h->cookie(-name=>"SID");						# SID aus Cookie lesen

$param="";

mkdir $Conf_UplVerz if(!(-d $Conf_UplVerz));					# ggf. Upload-Verzeichnis erzeugen

if ($act eq "mail")
{										# Kontakt-Mail schicken
  require Mail;

  $name = $h->param("name");
  $email = $h->param("email");
  $message = $h->param("message");
  $continue = $h->param("continue");

  my $myMail = Mail->new();
  $myMail->setFrom("bauordnungsamt\@lkspn.de");
  $myMail->setTo($Conf_Email);
  $myMail->setSubject("Nachricht von der Elektronischen Bauakte");
  $myMail->setData("Name: $name");
  $myMail->setData("Email: $email");
  $myMail->setData("Message: $message");
  $Output = $myMail->sendMail();

  print "Location:$continue\n\n";
  exit;
}
if ($act eq "logout" && $sid ne "")
{										# Logout-Seite erzeugen
  print "Set-Cookie: SID=; path=/\n";						# Cookie mit SID löschen

  my $XMLService = socketTools->new();
  $XMLService->setParam("LOGOUT $sid");
  $Output = $XMLService->sendRequest(0);

  $act = "";
  my @Eintraege;
  if(-d $Conf_UplVerz)
  {
    opendir(DIR,"$Conf_UplVerz");						# Tmp-Dateien beim Logout löschen
      @Eintraege = readdir(DIR);
    closedir(DIR);
    foreach (@Eintraege)
    {
      unlink($Conf_UplVerz."/".$_) if(substr($_,0,length($sid)) eq $sid);
    }
  }
  if($Conf_LogoutLoc ne "")
  {
    print "Location:".$Conf_LogoutLoc."\n\n";
    exit;
  }
}
if($act eq "")									# Start - Frameset erzeugen
{
  $user = $h->param("user");
  if($Pallg::pda == 0)
  {
    print "Content-Type: text/html\n\n";

    if(-f $iss."module/Frame.pm")
    {
      require $iss."module/Frame.pm";
    }
    else
    {
      print "<HTML><HEAD><TITLE>".$Conf_AppTitel."</TITLE></HEAD>".
            "<FRAMESET ROWS=\"".$Conf_KopfHoehe.",*\" FRAMEBORDER=0 FRAMESPACING=0 BORDER=0>".
            "<FRAME SRC=\"$sn?act=oben\" NAME=\"oben\" SCROLLING=\"no\">".
            "<FRAMESET COLS=\"".$Conf_NaviBreite.",*\" BORDER=0>\n".
            "<FRAME SRC=\"$sn?act=navi\" NAME=\"navi\">".
            "<FRAME SRC=\"$sn?act=login&user=$user\" NAME=\"main\">".
            "</FRAMESET></FRAMESET></HTML>";
    }
  }
  else
  {
    print "Location: $sn?act=loginpda&user=$user\n\n";
  }
  exit;
}
elsif($act eq "directlogin")
{
  $user=$h->param("user");
  $pwd=$h->param("pwd");
  print "Content-Type: text/html\n\n";
  if(-f $iss."module/Frame.pm")
  {
    require $iss."module/Frame.pm";
  }
  else
  {
    print "<HTML><HEAD><TITLE>".$Conf_AppTitel."</TITLE></HEAD>".
          "<FRAMESET ROWS=\"".$Conf_KopfHoehe.",*\" FRAMEBORDER=0 FRAMESPACING=0 BORDER=0>".
          "<FRAME SRC=\"$sn?act=oben\" NAME=\"oben\" SCROLLING=\"no\">".
          "<FRAMESET COLS=\"".$Conf_NaviBreite.",*\" BORDER=0>\n".
          "<FRAME SRC=\"about:blank\" NAME=\"navi\">".
          "<FRAME SRC=\"$sn?act=main&user=$user&pwd=$pwd\" NAME=\"main\">".
          "</FRAMESET></FRAMESET></HTML>";
  }
  exit;
}
elsif ($act eq "loginpda")
{										# Startseite mit Loginfenster für PDA
  $user=$h->param("user");
  $Output = "<START>".
            "<USER>$user</USER>".
            "</START>";
  XMLOut($Output,"start");
  exit;
}
elsif ($act eq "mainpda")
{
  $user = $h->param("user");
  $pwd = $h->param("pwd");
  my $XMLService = socketTools->new();
  $XMLService->setParam("LOGIN $user $pwd");
  $Output = $XMLService->sendRequest();

  $Output =~ /<MESSAGE>/g;							# SID auslesen
  $Treffer = pos($Output);
  $sid = substr($Output,$Treffer,36);

  print "Set-Cookie: SID=".$sid."; path=/\n";					# Cookie mit SID setzen
  my $XMLService = socketTools->new();
  $XMLService->setParam("GETDATA ".$sid."00001000009");
  my $Xml = $XMLService->sendRequest();
  XMLOut($Xml,"meineaz");
  exit;
}
if ($act eq "login")
{										# Startseite mit Loginfenster
  $hua = $ENV{"HTTP_USER_AGENT"};
  $xml = (($hua =~ /MSIE 6/) || $Conf_HTML == 1) ? 1 : 0;

  $user=$h->param("user");
  $Output = "<START>".
            "<USER>$user</USER>".
            "<XML>$xml</XML>".
            "</START>";
  XMLOut($Output,"start");
  exit;
}
if ($act eq "oben")
{										# Kopfzeile erzeugen
  $Output  = "<KOPF>";
  $Output .= "</KOPF>";
  XMLOut($Output,"kopf");
  exit;
}
if ($act eq "chpwd")
{										# Seite zum Passwort ändern
  $Output  = "<CHPWD><ERROR>0</ERROR>";
  my $XMLService = socketTools->new();
  $XMLService->setParam("GETUSERDATA $sid");					# Benuterdaten einfügen
  $Output .= $XMLService->sendRequest();
  $Output .= "</CHPWD>";
  XMLOut($Output,"chpwd");
  exit;
}

if ($act eq "datenschutz")					# DATENSCHUTZSEITE LKSPN
{
  $xml = (($hua =~ /MSIE 6/) || $Conf_HTML == 1) ? 1 : 0;										# Seite zum Datenschutz
  $Output ="<DATENSCHUTZ><ERROR>0</ERROR></DATENSCHUTZ>";
  XMLOut($Output,"datenschutz");
  exit;
}

if ($act eq "kommunikation")					# Seite zum Kommunikationshinweis
{
  $Output ="<KOMMUNIKATION><ERROR>0</ERROR></KOMMUNIKATION>";
  XMLOut($Output,"kommunikation");
  exit;
}


if ($act eq "navi")
{										# Allgemeine Navigation erzeugen
  $Output = "<NAVI>";
  if($sid ne "")
  {
    my $XMLService = socketTools->new();
    $XMLService->setParam("GETNAVI $sid");					# Navigation holen
    $Output .= $XMLService->sendRequest();
    $XMLService->setParam("GETUSERDATA $sid");					# Benutername einfügen
    $Output .= $XMLService->sendRequest();
    $Output .= "<START>0</START>";
  }
  else
  {
    $Output .= "<START>1</START>";
  }
  $Output .= "</NAVI>";

  XMLOut($Output,"navi");
}
if ($act eq "checknewuser")
{										# Neuen User prüfen
  $login = $h->param("login");							# Daten einlesen
  $vorn = $h->param("vorn");
  $nachn = $h->param("nachn");
  $email = $h->param("email");
  $str = $h->param("str");
  $hnr = $h->param("hnr");
  $plz = $h->param("plz");
  $ort = $h->param("ort");
  $pwd1 = $h->param("pwd1");
  $pwd2 = $h->param("pwd2");
  $az = $h->param("az");
  $tel = $h->param("tel");
  $fax = $h->param("fax");

  @error[0] = CheckValue($login,1,20);						# Daten auf Gültigkeit prüfen
  @error[1] = CheckValue($vorn,1,50);
  @error[2] = CheckValue($nachn,1,50);
  @error[3] = CheckValue($email,1,100);
  @error[4] = CheckValue($str,1,50);
  @error[5] = CheckValue($hnr,1,10);
  @error[6] = CheckValue($plz,5,5);
  @error[7] = CheckValue($ort,1,50);
  if(($pwd != "" && $Conf_NewUserMode == 2) || $Conf_NewUserMode == 1)
  {
    if($Conf_PassLen > 0)
    {
      @error[8] = CheckValue($pwd1,$Conf_PassLen,30);
    }
    else
    {
      @error[8] = CheckValue($pwd1,7,30);
    }
  }
  #if(($tel != "" && $Conf_NewUserMode == 2) || $Conf_NewUserMode == 1)
  #{
  #  @error[9] = CheckValue($tel,1,30);
  #}
  #if(($fax != "" && $Conf_NewUserMode == 2) || $Conf_NewUserMode == 1)
  #{
  #  @error[10] = CheckValue($fax,1,30);
  #}

  if($pwd1 ne $pwd2)
  {
    @error[8] = "pr&#252;fen";
  }

  if(@error[0] ne "" || @error[1] ne "" || @error[2] ne "" ||
     @error[3] ne "" || @error[4] ne "" || @error[5] ne "" ||
     @error[6] ne "" || @error[7] ne "" || @error[8] ne "" ||
     @error[9] ne "" || @error[10] ne "")
  {										# Fehler bei der Eingabe
    $Output = CheckNewUser();
    XMLOut($Output,"newuser");
    exit;
  }
  else                                                                          # Prüfung ok
  {
    if($Conf_NewUserMode == 1)
    {
      $xml = "<USERDATA>".
               "<LOGIN>$login</LOGIN>".
               "<PWD>$pwd1</PWD>".
               "<FIRSTNAME>$vorn</FIRSTNAME>".
               "<NAME>$nachn</NAME>".
               "<MAIL>$email</MAIL>".
               "<STR>$str</STR>".
               "<HNR>$hnr</HNR>".
               "<PLZ>$plz</PLZ>".
               "<ORT>$ort</ORT>".
               "<TEL>$tel</TEL>".
               "<FAX>$fax</FAX>".
             "</USERDATA>";

      $xml = umlauterev($xml);

      my $XMLService = socketTools->new();
      $XMLService->setParam("CREATEUSEREXT $xml");
      $Output = $XMLService->sendRequest(0);

      if (lc(substr($Output,0,7)) eq "<error>")                                 # Fehler beim Erzeugen
      {
        if($Output =~ /300/)							# Benutzername existiert bereits
        {
          @error[0] = "existiert bereits";
          $Output = CheckNewUser();
          XMLOut($Output,"newuser");
          exit;
        }
        else
        {
          XMLOut($Output,"error");
        }
        exit;
      }
      else									# Benutzer erzeugt
      {
        $act="main";								# Prüfung ok - Anmeldung erfolgt
        $user = $login;
        $pwd = $pwd1;
        $param = "newuser";
      }
    }
    else
    {
      require Mail;
      use Socket;

      $hostip = gethostbyaddr(inet_aton($ENV{'SERVER_ADDR'}), AF_INET);
      $hostip =~ s/[\n\r]//g;

      my $SB_Mail = Mail->new();
      $SB_Mail->setFrom("bauordnungsamt\@lkspn.de");
      $SB_Mail->setTo($Conf_Email);
      $SB_Mail->setSubject("Neuanmeldung für die Bauen-Online");
      $SB_Mail->setData("Login: ".umlauterev($login));
      $SB_Mail->setData("Passwort: ".umlauterev($pwd1));
      $SB_Mail->setData("Name: ".umlauterev($vorn)." ".umlauterev($nachn));
      $SB_Mail->setData("Email: ".umlauterev($email));
      $SB_Mail->setData("Straße: ".umlauterev($str)." $hnr");
      $SB_Mail->setData("Ort: $plz ".umlauterev($ort));
      $SB_Mail->setData("Aktenzeichen: $az");
      $Nix = $SB_Mail->sendMail();

      $Output = "<NEUANMELDUNG>".
                  "<USER>$vorn $nachn</USER>".
                "</NEUANMELDUNG>";
      XMLOut($Output,"neuanm");
    }
  }
}
if ($act eq "main")
{
  if($param ne "newuser")
  {
    $user = $h->param("user");
    $pwd = $h->param("pwd");
  }
  my $XMLService = socketTools->new();
  $XMLService->setParam("LOGIN $user $pwd");
  $Output = $XMLService->sendRequest();

  if(lc(substr($Output,0,7)) eq "<error>")
  {
    XMLOut($Output,"error");
    exit;
  }


  $Output =~ /<MESSAGE>/g;							# SID auslesen
  $Treffer = pos($Output);
  $sid = substr($Output,$Treffer,36);

  print "Set-Cookie: SID=".$sid."; path=/\n";					# Cookie mit SID setzen
  my $Xml = "<DATEN>";
  my $XMLService = socketTools->new();
  $XMLService->setParam("GETUSERDATA $sid");
  $Xml .= $XMLService->sendRequest();
  $Xml .= "</DATEN>";
  XMLOut($Xml,"main");
  exit;
}
if ($act eq "newuser")
{										# Neuen User registrieren
  $Output = CheckNewUser();
  XMLOut($Output,"newuser");
  exit;
}
if($h->param("type") eq "public" && $sid eq "")
{
  $sid="abcdefghijklmnopqrstuvwxyz1234567890";
}

##################### Ab hier geht nichts mehr ohne SID! ######################

if($sid eq "")
{
  $Output = error(700,"Dieser Aufruf ist ohne angemeldete Session nicht erlaubt");
  XMLOut($Output,"error");
}
elsif ($act eq "dochpwd")
{										# Passwort ändern
  $oldpwd = $h->param("oldpwd");
  $newpwd1 = $h->param("newpwd1");
  $newpwd2 = $h->param("newpwd2");
  $uid = $h->param("uid");
  if($newpwd1 ne $newpwd2)
  {
    $Output = "<CHPWD><ERROR>1</ERROR><USERDATA><USERID>$uid</USERID></USERDATA></CHPWD>";
    XMLOut($Output,"chpwd");
  }
  elsif(length($newpwd1) < $Conf_PassLen)
  {
    $Output = error(701,"Das eingegebene Kennwort ist zu kurz");
    XMLOut($Output,"error"); 
  }
  else
  {
    my $XMLService = socketTools->new();
    $XMLService->setParam("CHANGEPWD <USERDATA><OLDPWD>$oldpwd</OLDPWD><NEWPWD>$newpwd1</NEWPWD><UID>$uid</UID></USERDATA>");
    $Output = $XMLService->sendRequest();
    XMLOut($Output,"answer");
  }
  exit;
}
elsif($act eq "key")
{										# Daten aus Produktmodulen ausgeben
  $key = $h->param("key");
  $folge = $h->param("folge");

  $ProdID = $folge ne "" ? substr($folge,0,5) : substr($key,0,5);		# Produkt-ID aus Schlüssel holen

  if(!(-f $iss."module/P".$ProdID.".pm"))						# Produktmodul vorhanden?
  {
    $Output = error(703,"Das f&#252;r diesen Aufruf erforderliche Produktmodul ist nicht vorhanden");
    XMLOut($Output,"error");
    exit;
  }

  require $iss."module/P".$ProdID.".pm";						# Produktmodul einbinden
  eval("P".$ProdID."::SonderAufruf(\"$sid\",\"$key\",\"$folge\");");		# Sonderaufruf (z.B. Download ohne XML-Ausgabe)
  $XSLDoc = eval("P".$ProdID."::GetXSL(\"$key\",\"$folge\", \"$sid\");");	# XSL-Dokument finden
  $Aufruf = eval("P".$ProdID."::GetAufruf(\"$sid\",\"$key\",\"$folge\");");	# Aufruf für die Socket-Verbindung holen
  if($Aufruf eq "")
  {										# Ohne Aufruf den DirectOutput holen (z.B. Suchmaske)
    $Output = eval("P".$ProdID."::DirectOutput(\"$sid\",\"$key\",\"$folge\");");
  }
  else
  {
    my $XMLService = socketTools->new();
    $XMLService->setParam($Aufruf);						# Daten holen
    $Output = $XMLService->sendRequest();
  }
  $Pallg::Zwischenspeicher = $Output;
  eval("P".$ProdID."::SonderAufruf2(\"$sid\",\"$key\",\"$folge\");");		# Sonderaufruf2 (z.B. XML Zwischenspeichern)
  writelog("Output: ".$Output." XSLDoc: ".$XSLDoc);
  XMLOut($Output,$XSLDoc);
  exit;
}
else
{
  $Output = error(704,"Ung&#252;ltiger Aufruf");				# Ungültiger Aufruf
  XMLOut($Output,"error");
}

#######################   F u n k t i o n e n   ################################

sub CheckNewUser								# XML für CheckNewUser erzeugen
{
  my $Output = "<NEWUSER>".
                 "<LOGIN>$login</LOGIN>".
                 "<VORN>$vorn</VORN>".
                 "<NACHN>$nachn</NACHN>".
                 "<MAIL>$email</MAIL>".
                 "<STR>$str</STR>".
                 "<HNR>$hnr</HNR>".
                 "<PLZ>$plz</PLZ>".
                 "<ORT>$ort</ORT>".
                 "<ERROR>".
                   "<FLOGIN>$error[0]</FLOGIN>".
                   "<FVORN>$error[1]</FVORN>".
                   "<FNACHN>$error[2]</FNACHN>".
                   "<FMAIL>$error[3]</FMAIL>".
                   "<FSTR>$error[4]</FSTR>".
                   "<FHNR>$error[5]</FHNR>".
                   "<FPLZ>$error[6]</FPLZ>".
                   "<FORT>$error[7]</FORT>".
                   "<FPWD>$error[8]</FPWD>".
                 "</ERROR>".
               "</NEWUSER>";
  return $Output;
}