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