summaryrefslogblamecommitdiffstats
path: root/ldap-site-mngmt/webinterface/login_sicher.php
blob: 307b7b92dee4546c71f28aa1c12e4f21ed89f060 (plain) (tree)
1
2
3
4
5
6
7
8

     

                                                                                                       

                                                                                                    

                                                                                                 






























                                                                                             
                                                                   
                                                                                  
                                                  
                                                 
                                                                                                               



                                                                                  
                                                           















                                                                                   
                                                   

                                                  
                                                         


                                                                                                                          
                                                                               






                                                                                                                     
                                                              

                                                                                                    
                                       
















                                                                                                                     
                                                                       
                                        
                                                                                                             




                                                       
                                                                                                         




            
                                                                            
 
                                                                                         














                                                                                             
                                                                                               
















                                                                                                                     

                                                                                                               













                                                                                                              
                                                                                               




















































                                                                                                                                                                                                                               
                                                                                                















                                                                                                              
                                                                                               




























































                                                                                                                                                                                                                               
                                                                           

                                                                                  
                                                          
                                                                                   
                                                                                                    









                                                                                              
                                                                       





                                                                                                                
                                                  










                                                             

                               





                                      
                                                                           


                                                                                                 



                                                                                                  



                                          


                                         
        
                                                                        




                          
<?php
/**
* login_sicher.php f�hrt einen Bind mit den eingegebenen Benutzerdaten durch.
* Dabei erfolgt die Authetifizierung entsprechend der Ausf�hrung bei der Pr�sentation des Projektes
* am RZ-LDAP. Das Passwort des Users wird aber nun nicht mehr auf dem Gruppe1 LDAP gespeichert. Dort
* legt das Skript ein Standardpasswort an.
* Im Fehlerfall wird eine Meldung ausgegeben und anschlie�end auf index.php weitergeleitet.
* Bei erfolgreichem nicht anonymem Bind werden die Benutzerrechte ausgelesen und davon abh�ngig
* die entsprechende Startseite aufgerufen. dn, uid, userPassword, cn und die Rechte werden in
* einer Session gespeichert.
*
* DIESE VERSION IST AKTUELL IM EINSATZ!!!!
*
* @version V3.2
* @author Timothy Burk
*/
session_cache_expire(30);
session_start();

# LDAP-Bibliothek einbinden
include("lib/ldap.inc.php");
# Standard-Bibliothek einbinden
include("lib/commonlib.inc.php");

$uid = $_POST['uid'];
$userPassword = $_POST['userPassword'];
# $userDn_rz = "uid=".$uid.",ou=people,".$suffix_rz;
$userDN = "uid=".$uid.",ou=people,".$suffix;

#echo "uid: "; print_r($uid); echo "<br>";
#echo "pw: "; print_r($userPassword); echo "<br>";

checkLogin($uid,$userPassword);

/**
* checkLogin($uid, $userPassword) - Authentifizierung am RZ-LDAP und Gruppe1-LDAP
*
* Wenn RZ-LDAP-Login UND Gruppe1-LDAP-Login erfolgreich sind, dann ist der User
* bereits im Gruppe1-LDAP eingetragen.
* -> Mache Datenabgleich und anschlie�enden Login am Gruppe1-LDAP
* Wenn RZ-LDAP-Login erfolgreich, Gruppe1-LDAP-Login jedoch nicht erfolgreich ist,
* dann unterscheide zwischen zwei M�glichkeiten:
* 1. Der User ist im Gruppe1-LDAP nicht angelegt,
* 2. Der User ist im Gruppe1-LDAP zwar angelegt, aber das Passwort wurde auf dem RZ-LDAP inzwischen ge�ndert.
* -> Login als Dummy und Check, ob UID vorhanden
* Wenn RZ-LDAP-Login nicht erfolgreich, Gruppe1-LDAP-Login jedoch erfolgreich ist,
* dann ist der User auf dem RZ-LDAP nicht gespeichert.
* -> Login am Gruppe1-LDAP
* In anderen F�llen waren die Zugangsdaten nicht korrekt.
* -> Redirect auf index.php.
*
* Schema siehe auch /home/gruppe1/Praesentation/Login und Personen.pps
*
* @param string UID
* @param string Password
*
* @see userLogin()
* @see datenabgleich()
* @see dummyUidCheck()
* @see userAnlegen()
*
* @author Timothy Burk
*/
function checkLogin($uid = "", $userPassword = "") {
    global $userDn_rz, $userDN, $suffix, $suffix_rz, $ldapError, $standardPassword;
    # Abfrage, ob das Loginformular Daten enth�lt
    if(!(($uid == "") || ($userPassword == ""))) {
        # UID und Passwort wurden eingegeben
        # Fallunterscheidung welche Logins m�glich sind
		  /* if(($ds_rz = rzLdapConnect($uid,$userPassword)) && ($ds = uniLdapConnect($uid, $standardPassword))) {
            # Wenn RZ-LDAP-Login UND Gruppe1-LDAP-Login erfolgreich sind, dann ist der User
            # bereits im Gruppe1-LDAP eingetragen.
            # -> Mache Datenabgleich und anschlie�enden Login am Gruppe1-LDAP
            datenabgleich($uid, $userPassword, $ds_rz, $ds);
            ldap_unbind($ds);
            ldap_unbind($ds_rz);
            $userPassword = $standardPassword;
            userLogin($uid, $userPassword);
        } else if(($ds_rz = rzLdapConnect($uid,$userPassword)) && !($ds = uniLdapConnect($uid, $standardPassword))) {
            # Wenn RZ-LDAP-Login erfolgreich, Gruppe1-LDAP-Login jedoch nicht erfolgreich ist,
            # dann unterscheide zwischen zwei M�glichkeiten:
            # 1. Der User ist im Gruppe1-LDAP nicht angelegt,
            # 2. Der User ist im Gruppe1-LDAP zwar angelegt, aber das Passwort wurde auf dem RZ-LDAP
            #    inzwischen ge�ndert.
            # -> Login als Dummy und Check, ob UID vorhanden
            if(dummyUidCheck($uid)) {
                #changePassword($uid,$userPassword);
                $userPassword = $standardPassword;
            } else {
                userAnlegen($uid,$userPassword,$ds_rz);
            }
            ldap_unbind($ds_rz);
            $userPassword = $standardPassword;
            checkLogin($uid, $userPassword);
        } else if(!($ds_rz = rzLdapConnect($uid,$userPassword)) && */ if ($ds = uniLdapConnect($uid,$userPassword)) {
            # Wenn RZ-LDAP-Login nicht erfolgreich, Gruppe1-LDAP-Login jedoch erfolgreich ist,
            # dann ist der User auf dem RZ-LDAP nicht gespeichert.
            # -> Login am Gruppe1-LDAP
            ldap_unbind($ds);
            userLogin($uid, $userPassword);
        } else {
            # In anderen F�llen waren die Zugangsdaten nicht korrekt.
            # -> Redirect auf index.php.
            redirect(3, "index.php", "<h3>Bitte geben Sie korrekte Zugangsdaten ein.<h3>".$ldapError, FALSE);
            die;
        }

    } else {
        # UID und/oder Passwort wurden NICHT eingegeben
        redirect(3, "index.php", "<h3>Bitte geben Sie User-Id und Passwort ein.</h3>".$ldapError, FALSE);
        die;
    }
}

/**
* dummyUidCheck($uid) - �berpr�ft, ob UID im Gruppe1-LPAD vorhanden ist.
*
* �ber den Dummyuser wird eine Verbindung zum Gruppe1-LDAP aufgebaut und die angegebene
* UID wird gesucht.
*
* @param string UID
*
* @return boolean TRUE = UID vorhanden, FALSE = UID nicht gefunden
*
* @author Timothy Burk
*/
function dummyUidCheck($uid) {
    global $userDn, $suffix, $suffix_rz, $ldapError, $dummyUid, $dummyPassword;
    # Bei Erfolg stellen wir eine Verbindung mit unserem LDAP her. Dazu nutzen wir den Dummy:
    if(!($ds_dummy = uniLdapConnect($dummyUid, $dummyPassword))) {
        redirect(5, "index.php", "Dummy-Login fehlgeschlagen!<br>".$ldapError, FALSE);
        die;
    }
    # Im n�chsten Schritt wird �berpr�ft, ob ein Eintrag mit der UID $uid schon vorliegt:
    if(!($person_daten = uniLdapSearch($ds_dummy, "ou=people,".$suffix, "uid=$uid", array("*"), "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }
    if($person_daten['count'] == 0) {
        # Eintrag ist nicht vorhanden. -> Anlegen
        ldap_unbind($ds_dummy);
        return FALSE;
    } else {
        ldap_unbind($ds_dummy);
        return TRUE;
    }
}

/**
* userAnlegen($uid,$userPassword,$ds_rz)
*
* Legt mithilfe des Dummyusers einen noch nicht bei uns gef�hrten User im Gruppe1-LDAP
* mit den Daten des Rechenzentrums an. Das Passwort ist dabei f�r alle User in der config.inc.php festgelegt.
*
* @param string UID
* @param string Password
* @param resource RZ-LDAP Directory Handle
*
* @author Timothy Burk
*/
function userAnlegen($uid,$userPassword,$ds_rz) {
    global $userDn_rz, $userDn, $suffix, $suffix_rz, $ldapError, $dummyUid, $dummyPassword, $standardPassword;
    # Bei Erfolg stellen wir eine Verbindung mit unserem LDAP her. Dazu nutzen wir den Dummy:
    if(!($ds_dummy = uniLdapConnect($dummyUid, $dummyPassword))) {
        redirect(5, "index.php", "Dummy-Login fehlgeschlagen!<br>".$ldapError, FALSE);
        die;
    }
    # Im n�chsten Schritt wird �berpr�ft, ob ein Eintrag mit der UID $uid schon vorliegt:
    $ruffelder = array("uid", "sn", "givenname", "uidnumber", "gidnumber", "homedirectory", "loginshell", "rufnutzernummer", "rufanrede", "rufeinrichtung", "rufmatnr", "rufaccounttype", "ruffakultaet", "mail", "rufdienst");

    if(!($person_daten = uniLdapSearch($ds_rz, "ou=people,".$suffix_rz, "uid=$uid", $ruffelder, "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }
    $person_daten = ldapArraySauber($person_daten);
    $person_daten = $person_daten[0];
    foreach($ruffelder as $ruffeld) {
        $ruffeld = str_replace("ruf","",$ruffeld);
        if($ruffeld == "accounttype") {
            $gruppe1felder[] = "employeetype";
        } else if($ruffeld == "anrede") {
            $gruppe1felder[] = "title";
        } else {
            $gruppe1felder[] = $ruffeld;
        }
    }
    $i = 0;
    $neuerEintrag = array();
    foreach($gruppe1felder as $gruppe1feld) {
        if (isset($person_daten[$ruffelder[$i]])) {
            $neuerEintrag[$gruppe1feld] = $person_daten[$ruffelder[$i]];
        } else {
            $neuerEintrag[$gruppe1feld] = '';
        }
        $i++;
    }
    if($neuerEintrag['employeetype'] != "student") {
        unset($neuerEintrag['employeetype']);
    } else {
        $neuerEintrag['employeetype'] = ucfirst($neuerEintrag['employeetype']);
    }
    $neuerEintrag['userPassword'] = $userPassword;
    # Ermitteln der Initialen: Erster Buchstabe des Vornamens und erster Buchstabe des Nachnamens
    $neuerEintrag['initials'] = substr($neuerEintrag['givenname'],0,1).".".substr($neuerEintrag['sn'],0,1).".";

    # CN erstellen
    $neuerEintrag['cn'] = $neuerEintrag['givenname']." ".$neuerEintrag['sn'];

    # Aktiv setzen
    $neuerEintrag['aktiv'] = "yes";
    $neuerEintrag = inputArraySauber($neuerEintrag);

    # Festes Sicherungspasswort setzen
    $neuerEintrag['userPassword'] = $standardPassword;
    if(!($add = uniLdapAdd($ds_dummy, $userDn, $neuerEintrag, "personen"))) {
        redirect(5, "index.php", "<b>Eintrag nicht erfolgreich</b><br>".$ldapError, FALSE);
        die;
    }
}

/**
* datenabgleich($uid, $userPassword, $ds_rz, $ds) - �berschreibt bei jedem Login die Daten des
* Gruppe1-LDAP mit denen des RZ-LDAP mithilfe des Dummyusers.
*
* @param string UID
* @param string Password
* @param resource ds_rz RZ-LDAP Directory Handle
* @param resource ds Gruppe1-LDAP Directory Handle nach Bind mit Dummyuser
*
* @author Timothy Burk
*/
function datenabgleich($uid, $userPassword, $ds_rz, $ds) {
    global $userDn_rz, $userDn, $suffix, $suffix_rz, $ldapError, $dummyUid, $dummyPassword, $standardPassword;
    # Bei Erfolg stellen wir eine Verbindung mit unserem LDAP her. Dazu nutzen wir den Dummy:
    if(!($ds_dummy = uniLdapConnect($dummyUid, $dummyPassword))) {
        redirect(5, "index.php", "Dummy-Login fehlgeschlagen!<br>".$ldapError, FALSE);
        die;
    }
    # Im n�chsten Schritt wird �berpr�ft, ob ein Eintrag mit der UID $uid schon vorliegt:
    $ruffelder = array("uid", "sn", "givenname", "uidnumber", "gidnumber", "homedirectory", "loginshell", "rufnutzernummer", "rufanrede", "rufeinrichtung", "rufmatnr", "rufaccounttype", "ruffakultaet", "mail", "rufdienst");

    if(!($person_daten = uniLdapSearch($ds_rz, "ou=people,".$suffix_rz, "uid=$uid", $ruffelder, "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }
    $person_daten = ldapArraySauber($person_daten);
    $person_daten = $person_daten[0];
    foreach($ruffelder as $ruffeld) {
        $ruffeld = str_replace("ruf","",$ruffeld);
        if($ruffeld == "accounttype") {
            $gruppe1felder[] = "employeetype";
        } else if($ruffeld == "anrede") {
            $gruppe1felder[] = "title";
        } else {
            $gruppe1felder[] = $ruffeld;
        }
    }
    $i = 0;
    $neuerEintrag = array();
    foreach($gruppe1felder as $gruppe1feld) {
        if (isset($person_daten[$ruffelder[$i]])) {
            $eintrag = $person_daten[$ruffelder[$i]];
        } else {
            $eintrag = '';
        }
        $neuerEintrag[$gruppe1feld] = $eintrag; //$person_daten[$ruffelder[$i]];
        $i++;
    }

    if($neuerEintrag['employeetype'] != "student") {
        unset($neuerEintrag['employeetype']);
    } else {
        $neuerEintrag['employeetype'] = ucfirst($neuerEintrag['employeetype']);
    }
    $neuerEintrag['userPassword'] = $userPassword;
    # Ermitteln der Initialen: Erster Buchstabe des Vornamens und erster Buchstabe des Nachnamens
    $neuerEintrag['initials'] = substr($neuerEintrag['givenname'],0,1).".".substr($neuerEintrag['sn'],0,1).".";

    # CN erstellen
    $neuerEintrag['cn'] = $neuerEintrag['givenname']." ".$neuerEintrag['sn'];

    # Aktiv setzen
    $neuerEintrag['aktiv'] = "yes";
    $neuerEintrag = inputArraySauber($neuerEintrag);

    # Festes Sicherungspasswort setzen
    $neuerEintrag['userPassword'] = $standardPassword;

    if(!($alteDaten = uniLdapSearch($ds_dummy, "ou=people,".$suffix, "uid=$uid", array("*"), "", "list", 0, 0))) {
        redirect(5, "index.php", $ldapError, FALSE);
        die;
    }

    if(uniLdapModify($ds_dummy, $userDn, $alteDaten, $neuerEintrag, 0)) {
        $meldung = "Daten abgeglichen";
    }

}

/**
* userLogin($uid, $userPassword) - F�hrt den Login am Gruppe1-LDAP durch.
*
* Nach erfolgreicher Identifikation und ggf. neuem Anlegen oder Datenabgleich wird
* mit userLogin() der Bind am Gruppe1-LDAP durchgef�hrt.
* Die Rechte und der CN des Users werden ausgelesen und in der Session gespeichert.
* Anschlie�end leitet das Skript auf die Startseite der Verwaltung (person_daten_show.php) weiter.
*
* @param string UID
* @param string Password
*
* @author Timothy Burk
*/
function userLogin($uid, $userPassword) {
    global $userDN, $suffix, $ldapError;
    # Verbindung mit der Datenbank herstellen
    if(($uid == "") || ($userPassword == "") || !($ds = uniLdapConnect($uid,$userPassword))) {
      redirect(3, "index.php", "Falscher Login<br>".$ldapError, FALSE);
      die;
    }
    
    # cn abfragen
    $cn = "Gast";
    if(!($person_daten = uniLdapSearch($ds, "ou=people,".$suffix, "uid=$uid", array("cn"), "", "list", 0, 0))) {
      redirect(3, "index.php", $ldapError, FALSE);
      die;
    } else {
      $cn = str_replace('\"', '', $person_daten[0]['cn'][0]);
    }

    # Speichern der Sessionvariablen
    $_SESSION['uid'] = $uid;
    $_SESSION['userPassword'] = $userPassword;
    $_SESSION['dn'] = $userDN;
    $_SESSION['cn'] = $cn;
    $_SESSION['audn'] = "";
    $_SESSION['status'] = "in";
    $_SESSION['error'];

    # LDAP-Bind aufheben
    ldap_unbind($ds);
	 
	 $mesg = "<html>
				<head>
					<title>AdminUnit Management</title>
					<link rel='stylesheet' href='styles.css' type='text/css'>
				</head>
				<body>
				<table border='0' cellpadding='200' cellspacing='0' width='100%'> 
				<tr valign='middle'><td align='center'>
	 			<h3>Bitte einen Moment Geduld, die Seite wird geladen ... <br>
	 			Falls nicht, klicken Sie bitte <a href='start.php'>hier</a>.<h3>
	 			</td></tr>
	 			</table>
	 			</body>
				</html>";
   # Aufruf der Startseite:
  	
   redirect(0, "start.php", $mesg, TRUE);
	
	# nichtmehr ben�tigte CSV-Dateien im tmp-Verzeichnis l�schen
	# listen_sauber();
}


?>