class benutzer
{
//Notiz zur mysql Struktur:
//Die Klasse benötigt ne "benutzer" tabelle mit den Feldern "Benutzername", "Passwort", "Rechte"
//Konstruktor
//IDEE: Object wird IMMER (ganz oben in der php datei wegen header fehler kram!!!) erstellt,
//und überprüft bei Erstellung, ob bereits eingelogt
//ansonsten ob vlt ein login statt finden soll (login-daten übertragen?)
//ansonsten sorgt es dafür das die status funktionen für "Access Denied" sorgen! ;-)
//also muss dann immer wenn ein login nötig ist der status abgefragt werden!
function benutzer()
{
include("mysql.php"); //verbindet zur mysql Datenbank
require_once('functions.php');
$this->dbPrefix = functions::db_prefix();
$this->error = ""; //Ein String der einen Fehlerhaften login speichert!
//so kann an beliebiger stelle die fehlermeldung ausgegeben werden!
//Statusvars initialisieren (auf "not logedIn" Werte)
$this->name = 'Gast'; //ein Gast ist ein Nichts... trotzdem der Form halber mal so genommen...
$this->logedin = false;
$this->accessRights = 0; //level 0 = keine Rechte, level 1 = normale Rechte, level 3 = Admin
$this->logedin = $this->check_login(); //überprüfe login (cookies auslesen!)
#echo $this->logedin; //debug msg -> 1 wird ausgeben! 1 ist doch true oder?
if ($this->logedin)
{
#echo "setting proberties"; //debug msg
//setze Status Vars auf erfolgreichen Login (das der cookie existiert ist durch check_login gewährleistet!
//setzt auch name und login bool:
$this->set_proberties(); //setzt accessRights und Gemeinde mit Werten aus der DB!
#echo "setting proberties"; //debug msg
}//end of bereits eingelogt
else
{
#echo "trying to log in"; //debug msg
//versuche ein zu logen, falls daten übetragen wurden
$logInWorked = false;
if(isset($_REQUEST['login']) && isset($_REQUEST['pw'])) //nimmt daten per get und post an!!!
$logInWorked = $this->login($_REQUEST['login'],$_REQUEST['pw']);
if(isset($_REQUEST['login']))
$nick = $_REQUEST['login']; //zwischengespeichert...
else $nick = 'Gast';
if (!$logInWorked)
{
//in dem fall evtl. das login forumlar anzeigen!
if (isset($_REQUEST['login']))
{
#echo "error"; //debug
$this->error = "Login Fehler!"; //falls Daten übermittelt wurden!
}
//include 'loginform.php'; //scheint probleme mit "header allready send" zu verursachen
//also muss ich dafür wohl außerhalb des objects sorge tragen...
}
else //login hat geklappt :)
{
#echo "setting proberties called"; //debug msg
//wenn login gefunzt hat wäre ein refresh gut!
//ansonsten müsste hier jetzt noch mal der kram wie oben stehen...
$this->set_probs($nick); //ach dann machen wir es doch so ^^
//das ist ne extra prob func, die den namen net ausem cookie holt
//sondern übergeben bekommt!
}
}//end of noch nicht eingelogt
//wenn das einlogen fehlgeschlagen ist, wurden oben bereits die status vars entsprechend gesetzt!
//(bzw. gar keine daten übetragen wurden)
}//end of constructor
//diese funktion versucht die login daten aus dem cookie zu laden
//und überprüft so, ob ein user eingelogt ist!
function check_login()
{
$loginOK = false; //Var die speichert ob der Login klappt
if (isset($_COOKIE["username"]) && $_COOKIE["username"] != '') //ein Username im Cookie, also Cookie existiert
{
//jetzt muss das Passwort und die gültigkeit des Users überprüft werden!!!#
if ( ($_COOKIE["password"] == "") || ($_COOKIE["password"] != $this->get_pw($_COOKIE["username"]) ) )
{
//kein PW oder falsches PW übergeben
#echo "wrong password!"; //debug msg
$loginOK = false; //eigentlich oben schon gesetzt
//aber so kann man hier noch was adden, falls nötig...
}
else
{
#echo "pw was ".$_COOKIE["password"];
/* Aha: SICHERHEITSLÜCKE!!!! :
Pw wird verglichen ob leer, aber pw verschlüsselt!!!
Also leer == d41d8cd98f00b204e9800998ecf8427e
Wenn jetzt also ein User obiges Pw hat, dann kann man
sich mit dem emptystr einlogen!!!
So fange jetzt den emptystr bei get_pw ab ;)
*/
#echo "password is good!"; //debug msg
//cookie ist ok :)
$loginOK = true;
}
}//end of cookie existiert
return $loginOK;
}//end of check_login()
//diese funktion spuckt das verschlüsselte passwort eines users aus#
//wenn der user nicht existiert wird ein emptystring ausgegeben
function get_pw($user)
{
$db_password = ""; //falls der user nicht existiert wird ein leeres pw ausgespuckt
$abfrage = "SELECT * FROM ".$this->dbPrefix."benutzer WHERE Benutzername ='".$user."'";
$ergebnis = mysql_query($abfrage);
if ($row = mysql_fetch_object($ergebnis))
{
$db_password = $row->Passwort;
}
//ein verschlüsselter empty str ist ein ilegales pw und ein leerer benutzer ist auch net erlaubt!!!
if ($db_password == 'd41d8cd98f00b204e9800998ecf8427e' || $user == '')
{
$db_password = '';
}
return $db_password;
}//end of get_pw()
function set_proberties()
{
//Ah das Problem könnte sein, dass der Username noch nicht sofort im Cookie verfügbar ist!!!
//Also das Prob mit dem richtigen status erst nach aktualisierung...)
$this->set_probs( $_COOKIE["username"] ); //name aus cookie lesen
//und die andere set_probs func mit benutzen ^^
}//end of set_proberties()
function set_probs($nick)
{
$this->name = strtolower($nick);//name wie übergeben aber in Kleinbuchstaben!
//(alle names mit kleinbuchstaben in der datenbank!)
$this->logedin = true; //eingelogt
$abfrage = "SELECT * FROM ".$this->dbPrefix."benutzer WHERE Benutzername='".$this->name."'";
$ergebnis = mysql_query($abfrage);
if ($row = mysql_fetch_object($ergebnis))
{
$this->accessRights = $row->Rechte; //rechte aus mysql db lesen
}
}//end of set_probs
function login($login,$pass)
{
#echo "
login() called
"; //debu msg
$login = strtolower($login); //ACHTUNG: Loginname nur mit Kleinbuchstaben in die DB eintragen!
//mysql ist nicht casesensitive (?!) deshalb eigentlich net nötig ;) :D
$password = $this->get_pw($login); //password aus der db laden
//Ansonsten muss das eingegebene Passwort verschlüsselt werden ;)
$pw = md5($pass); //Einwegverschlüsseln des pw (evtl wäre crypt besser)
#$salt = '$37'; //der schlüssel
#$pw = crypt($pass,$salt); //hm der schlüssel ist immer im pw enthalten o.O
if ($password != '' && $pass != '') //wenn password existiert also user existiert UND eingebenes pw nicht emptystr!!!
{
$ok = true;
}
else
{
#echo 'User '.$login.' existiert nicht! ';
#echo 'Oder kein pw eingegeben!';
$ok = false;
}
if ($ok == true) //User existiert; PW muss verglichen werden!
{
if ($pw == $password) //wenn das (verschlüsselte) eingegebene pw = dem pw in der db ist
{
$this->logedin = true;
$timestamp1 = time(); #Cookie setzen:
$testbol1 = setcookie ("username", $login, time()+60*60*24*7*4*12*2);
$testbol2 = setcookie ("password", $pw, time()+60*60*24*7*4*12*2); /* , verfällt in ca. 2 Jahren */
//echo "DEBUG-MARK";
//bools könnten benutzt werden um zu checken ob es probs beim cookie setzen gab!
}//end of setting cookie
else $ok = false; //falls pw falsch wird $ok wieder false gesetzt
}//end of user existiert
return $ok; //ist am ende nur true, wenn cookie gesetzt wurde
}//end of login()
//schemißt die cookies und den nutzer wieder raus
function logout()
{
setcookie ("username", "", time() - 3600); //bereits vor einer stunde verfallen
setcookie ("password", "", time() - 3600); //im prinzip egal welcher wert, sollange < 0
$this->name = 'Gast';
$this->logedin = false;
$this->accessRights = 0;
}
//hier kommt die Verwaltung überhaupt erst zum tragen
//im index.php oder wo immer überprüft werden soll ob ein user eingelogt ist
//muss ein benutzer object erstellt werden
//und anschließend mit dieser funktion überprüft werden
//ob eine bestimmte sache angezeigt werden soll
//also ob der user rechte dafür hat
//die funktion kann von außen nur mit "tieferer kenntniss" benutzt werden:
//wenn sie 0 zurück gibt, hat der benutzer keinerlei rechte!
//wenn sie 1 zurück gibt, hat der benutzer standart rechte
//wenn sie 3 zurück gibt, hat der benutzer gemeinde admin rechte
//mehr rechte können einfach ergänzt werden...
//nieder wertige sachen können dann einfach mit benutzerlevel >= nötiger level geprüft werden!
function check_access()
{
return $this->accessRights;
}
//Syntaktischer Zucker für Normal user Access
//hiermit kann von außen ganz leicht geprüft werden, ob ein user auf "Level 1" Sachen Zugriff haben soll
function normal_access()
{
if ($this->accessRights >= 1)
return true;
else return false;
}
//Syntaktischer Zucker für K.IM. Admin user Acccess
//hiermit kann von außen ganz leicht geprüft werden, ob ein user auf "Level 3" Sachen Zugriff haben soll
function admin_access()
{
if ($this->accessRights >= 3)
return true;
else return false;
}
//Noch mal als syntaktischer Zucker
//um außerhalb des objects ein Login Formular zu erzeugen, falls "login failed" bzw. nicht statt gefunden hat
function login_failed()
{
return ! $this->logedin;
}
//Funktion gibt Fehlermeldung zurück, falls der login auf Grund eines falschen Passworts fehlgeschlagen ist!
function get_error()
{
return $this->error;
}
function get_name()
{
return $this->name;
}
}//end of class