<?php
## INDEX gegen LDAP
session_start();

include_once 'classes/TestProjektSmarty.class.php';
require_once("config.inc.php");
$smarty       = new Smarty();
$templatename = substr(basename($_SERVER['PHP_SELF']), 0, -3) . "html";
require_once "language/german.inc.php";


$action = $_GET['action'];
if ($action == '') {
  if (isset($_GET['error'])) {
    
    $errorno = $_GET['error'];
    
    $smarty->assign('index_error', 1);
    
    if ($errorno == 1) {
      $smarty->assign('index_error_text', "Es m&uuml;ssen alle Felder ausgef&uuml;llt werden");
    }
    
    if ($errorno == 3) {
      $smarty->assign('index_error_text', "Der Benutzername oder das Passwort ist nicht korrekt<br>Stellen Sie sicher, dass Ihr Benutzerkonto in der Hochschule aktiv ist.");
    }

    if ($errorno == 4) {
      $smarty->assign('index_error_text', "Der Benutzer ist nicht für das System freigegeben!<br>Bitte wenden Sie sich an den Administrator (<a href=\"mailto:$global_service_mail\">$global_service_admin</a>)");
    }
    
    if ($errorno == 5) {
      $smarty->assign('index_error_text', "Der Benutzer ist im System nicht vorhanden!<br>Bitte wenden Sie sich an den Administrator.");
    }
    
    # Daten aufbereiten bei Fehler
    if (isset($_SESSION["global_username"])) {
      $smarty->assign('index_user', $_SESSION["global_username"]);
    }
  }
  
  
}

if ($action == 'anmeld') {
  // Variablen setzen, damit sie nicht mit ISSET geprüft werden müssen. Standardeinstellungen sind so, dass kein Login möglich wäre
  $anzahl    = 0;
  $anzahl_db = 0;
  $login     = 1;
  $login_db  = 1;
  
  $username = strtolower($_POST["user"]); //remove case sensitivity on the username
  
  # AcitveDirectory oder OPEN LDAP
  if($global_ldap_art == 1){
    $password=utf8_decode($_POST["password"]);
  }
  if($global_ldap_art == 2){
    $password=$_POST["password"];
  }
  
  if ($_POST["user"] != "") {
    $_SESSION["global_username"] = $username;
  }
  
  if ($username == "" OR $password == "") {
    echo "<meta http-equiv=\"refresh\" content=\"0; URL=" . $_SERVER['PHP_SELF'] . "?error=1\">";
  } else {
    
    $db             = dbconnect();
    $query_server = $db->query("SELECT wert1 ip, wert2 port FROM dep_parameter WHERE pid='3'");
    $row_server   = $query_server->fetch_array();
    
    /*
    
    ################################
    ## Prüfe studnet ob Treffer
    ################################
    # bind wird benötigt, sonst werden die Umlaute bei Namen  nicht richtig angezeigt ?!!?
    
    $ds=@ldap_connect("141.10.144.37", "389");
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    $r=@ldap_bind($ds, $row_ldapuser['wert1'], $row_ldapuser['wert2']);
    $_ldap_dn = "ou=ouStudnet,dc=studnet,dc=hs-ludwigsburg,dc=de";
    $sr=@ldap_search($ds, $_ldap_dn, "samaccountname=$username");
    $info = @ldap_get_entries($ds, $sr);
    $anzahl = ldap_count_entries($ds,$sr);
    $vorname      = $info[0]['givenname'][0];
    $nachname     = $info[0]['sn'][0];
    $mail         = $info[0]['mail'][0];
    $first        = ldap_first_entry($ds,$sr);
    $distinguishedName  = ldap_get_dn($ds,$first);
    $result_jg = $db->query("SELECT ag, jahrgang FROM kurs.stud WHERE lower(uid)='$username'");
    $row_jg = $result_jg->fetch_array();
    ################################
    
    
    ### Wenn binden fehlschlägt, also Passwort falsch
    ##!!!!! IM STUDNET MIT DEM USERNAMEN BINDEN, IM HSNET MIT DEM DISTINGUISHEDNAME !!!!!!#################
    #if ($bind = @ldap_bind($ds, $username, $password) AND $anzahl > 0){
    if ($bind = ldap_bind($ds, $distinguishedName, $password) AND $anzahl > 0){
    # Bind funktioniert
    #echo "studnet: Bind funktioniert: $anzahl <br>";
    $login = "0";
    $login_ad = "studnet";
    }else{
    # Bind funktioniert nicht
    #echo "studnet: Bind funktioniert nicht: $anzahl <br>";
    $login = "1";
    ldap_close($ds); 
    }
    #exit;
    
    ########
    # INFO hsnet: Würde man nur $_ldap_dn = "dc=hsnet,dc=hs-ludwigsburg,dc=de"; angeben ohne OU=OUHochschunetzwerk oä., würde php beim search nichts mehr finden und alle Passwörter akzeptieren
    ########
    
    */
    ################################
    ## Prüfe OUHochschulnetzwerk ob Treffer, wenn studnet nicht funktioniert
    ################################
    //  if($login == "1" and $anzahl == "0"){
    
    $ds = @ldap_connect($global_ldap_serverhsnet, $global_ldap_porthsnet);
    if ($ds) {
      # bind wird benötigt, sonst werden die Umlaute bei Namen  nicht richtig angezeigt ?!!?
      $r                 = @ldap_bind($ds, $global_ldap_user, $global_ldap_pwd);
      $_ldap_dn          = "ou=OUHochschulnetzwerk,dc=hsnet,dc=hs-ludwigsburg,dc=de";
      $sr                = @ldap_search($ds, $_ldap_dn, "samaccountname=$username");

      $info              = @ldap_get_entries($ds, $sr);

      $anzahl            = ldap_count_entries($ds, $sr);
      $vorname           = $info[0]['givenname'][0];
      $nachname          = $info[0]['sn'][0];
      $mail              = $info[0]['mail'][0];
      $first             = ldap_first_entry($ds, $sr);
      $distinguishedName = @ldap_get_dn($ds, $first);
      ################################
      
      # Bind geht im hsnet nur über den DN "CN=Schwarz\, Alexander, OU=Externe Benutzer, ou=OUHochschulnetzwerk,dc=hsnet,dc=hs-ludwigsburg,dc=de"
      ##!!!!! IM STUDNET MIT DEM USERNAMEN BINDEN, IM HSNET MIT DEM DISTINGUISHEDNAME !!!!!!#################
      if ($bind = @ldap_bind($ds, $distinguishedName, $password) AND $anzahl > 0) {
        #echo "hsnet: Bind funktioniert: $anzahl  |$distinguishedName|<br>";
        $login    = "0";
        $login_ad = "hsnet";
      } else {
        # Bind funktioniert nicht
        $login = "1";
        ldap_close($ds);
        #echo "hsnet: Bind funktioniert nicht: $anzahl <br>";
      }
    }
    //  }
    
    
    ################################
    ## Prüfe OURechenzentrum ob Treffer, wenn OUHochschulnetzwerk nicht funktioniert
    ################################
    if ($login == "1" and $anzahl == 0) {
      
      $ds = @ldap_connect($global_ldap_serverhsnet, $global_ldap_porthsnet);
      if ($ds) {
        # bind wird benötigt, sonst werden die Umlaute bei Namen  nicht richtig angezeigt ?!!?
        $r                 = @ldap_bind($ds, $global_ldap_user, $global_ldap_pwd);
        $_ldap_dn          = "ou=OURechenzentrum,dc=hsnet,dc=hs-ludwigsburg,dc=de";
        $sr                = @ldap_search($ds, $_ldap_dn, "samaccountname=$username");
        $info              = @ldap_get_entries($ds, $sr);
        $anzahl            = ldap_count_entries($ds, $sr);
        $vorname           = $info[0]['givenname'][0];
        $nachname          = $info[0]['sn'][0];
        $mail              = $info[0]['mail'][0];
        $first             = ldap_first_entry($ds, $sr);
        $distinguishedName = @ldap_get_dn($ds, $first);
        ################################
        
        # Bind geht im hsnet nur über den DN "CN=Schwarz\, Alexander, OU=Externe Benutzer, ou=OUHochschulnetzwerk,dc=hsnet,dc=hs-ludwigsburg,dc=de"
        ##!!!!! IM STUDNET MIT DEM USERNAMEN BINDEN, IM HSNET MIT DEM DISTINGUISHEDNAME !!!!!!#################
        if ($bind = @ldap_bind($ds, $distinguishedName, $password) AND $anzahl > 0) {
          #echo "RZ: Bind funktioniert: $anzahl <br>";
          $login    = "0";
          $login_ad = "hsnet";
        } else {
          # Bind funktioniert nicht
          #echo "RZ: Bind funktioniert nicht: $anzahl <br>";
          $login = "1";
          ldap_close($ds);
        }
      }
    }
    
    /*
    echo "<br>
    distinguishedName = $distinguishedName<br>
    anzahl_hs $anzahl <br>
    Username $username, $vorname, $nachname, $mail<br>
    account: $username, $password<br>
    login $login<br>
    exit;
    */
    
    $db     = dbconnect();
    $result = $db->query("SELECT imtuid, uid, passwort FROM dep_user WHERE lower(uid)='$username'");
    $row    = $result->fetch_array();
    
    $resultanz = $db->query("SELECT count(*) Anz FROM dep_user WHERE lower(uid)='$username'");
    $rowanz    = $resultanz->fetch_array();
    $anzahl_db = $rowanz['Anz'];
    
    # Login geht nicht über LDAP, aber vielleicht über DB
    if ($login == "1" and $anzahl == 0) {
      if ($anzahl_db > 0) {
        # Userkennung gibt es
        
        if (md5($password) == $row['passwort']) {
          # Passwort richtig
          $login_db = "0";
        } else {
          # Passwort falsch
          $login_db = "1";
        }
      } else {
        # Userkennung gibt es nicht
        $login_db  = "1";
        $anzahl_db = 0;
      }
    }
    
    
    /* Loginmatrix mit Reihenfolge
    Sort	LDAP vorhanden	Datenbank vorhanden	PW LDAP richtig		PW DB richtig	Aktivität
    6	Nein		Ja			obs			Nein		Fehlermeldung PW falsch
    anzahl==0	anzahl_db>0		login == 1		login_db == 1
    
    2	Nein		Ja			obs			Ja		Login
    anzahl==0	anzahl_db>0		login == 1		login_db == 0
    
    4	Nein		Nein			obs			obs		Registrierung
    anzahl==0	anzahl_db==0		login == 1		-
    
    5	Ja		obs			Nein			obs		Fehlermeldung PW falsch
    anzahl > 0	-			login == 1		-
    
    3	Ja		Nein			Ja			obs		Registrierung
    anzahl > 0	anzahl_db==0		login == 0		-
    
    1	Ja		Ja			Ja			obs		Login
    anzahl > 0	anzahl_db>0		login == 0		-
    */
    
    
    
    
    # Sort 1
    if ($anzahl > 0 AND $anzahl_db > 0 AND $login == 0) {
      # Login über LDAP erfolgreich und Person in DB --> Login
      $db                          = dbconnect();
      $datum                       = date("Y-m-d H:i:s");
      $ip                          = getenv("REMOTE_ADDR");
      $agent                       = getenv("HTTP_USER_AGENT");
      $user_admin                  = $row['imtuid'];
      $_SESSION["global_uid"]      = $user_admin;
      $_SESSION["global_username"] = $row['uid'];
      $result_1                    = $db->query("INSERT INTO dep_userlog (Datum, IP, user_agent, imtuid) VALUES ('$datum', '$ip', '$agent', '$user_admin')");
      $sql                         = $db->query("UPDATE dep_user 
                                                    SET mail_inaktiv='0000-00-00 00:00:00'
                                                       ,vorname = '$vorname'
                                                       ,nachname = '$nachname'
                                                       ,mail = '$mail'
                                                  WHERE imtuid='$user_admin'");
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=indexframe.php\">";
      exit;
    }
    
    # Sort 2
    if ($anzahl == 0 AND $anzahl_db > 0 AND $login == 1 AND $login_db == 0) {
      # Person in LDAP nicht vorhanden aber Login über Datenbank erfolgreich --> Login
      $user_admin                  = $row['imtuid'];
      $_SESSION["global_uid"]      = $user_admin;
      $_SESSION["global_username"] = $row['uid'];
      $result_1                    = $db->query("INSERT INTO dep_userlog (Datum, IP, user_agent, imtuid) VALUES ('$datum', '$ip', '$agent', '$user_admin')");
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=indexframe.php\">";
      exit;
    }
    

    # Sort 3
    if ($anzahl > 0 AND $anzahl_db == 0 AND $login == 0) {
      # Login über LDAP erfolgreich aber Person nicht in DB --> Registrierung ohne Bestätigungsmail

      // Frage ist, ob man eine Bestätigungsmail erhält, oder ob der Admin freigibt, welcher Doz zugelassen ist. Geht nur, wenn alle im LDAP sind bzw. wenn Admin Doz manuell anlegt
      
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=" . $_SERVER['PHP_SELF'] . "?error=4\">";
      exit;
    }
    

    # Sort 4
    if ($anzahl == 0 AND $anzahl_db == 0 AND $login == 1) {
      # Person in LDAP und DB nicht vorhanden --> Registrierung über Admin
      
      // Frage ist, ob man eine Bestätigungsmail erhält, oder ob der Admin freigibt, welcher Doz zugelassen ist. Geht nur, wenn alle im LDAP sind bzw. wenn Admin Doz manuell anlegt
      
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=" . $_SERVER['PHP_SELF'] . "?error=5\">";
      exit;
    }
    
    # Sort 5
    if ($anzahl > 0 AND $login == 1) {
      # Person in LDAP vorhanden aber Passwort falsch --> Fehlermeldung PW LDAP falsch
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=" . $_SERVER['PHP_SELF'] . "?error=3\">";
      exit;
    }
    
    # Sort 6
    if ($anzahl == 0 AND $anzahl_db > 0 AND $login == 1 AND $login_db == 1) {
      # Person in LDAP nicht vorhanden aber in DB, dort aber Passwort falsch --> Fehlermeldung PW DB falsch
      
      echo "<meta http-equiv=\"refresh\" content=\"0; URL=" . $_SERVER['PHP_SELF'] . "?error=3\">";
      exit;
    }

    mysqli_close($db);
    
  } //if ($username == "" OR $password == "") {
}

$smarty->assign('action', "$action");
$smarty->display("$template/$templatename");
?>
