linkDB(); $sql = "SELECT email, password, validUntil FROM user WHERE email = :email"; $params = [":email" => $email]; try { $sth = $pdo->prepare($sql); $sth->execute($params); $user = $sth->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Abrufen der Benutzerdaten.", $e); return "Interner Datenbankfehler."; // Nur für Debug sichtbar machen, sonst besser allgemein halten } if (!$user) { return "Benutzer mit dieser E-Mail wurde nicht gefunden."; } if (!password_verify($password, $user['password'])) { return "Das eingegebene Passwort ist falsch."; } try { $now = new DateTime(); $validUntil = new DateTime($user['validUntil']); if ($now > $validUntil) { return "Ihr Passwort ist abgelaufen. Bitte setzen Sie ein neues über \"Passwort vergessen\"."; } } catch (\Exception $e) { new \Blog\Library\ErrorMsg("Fehler beim Verarbeiten des Gültigkeitsdatums.", $e); return "Fehler bei der Passwortprüfung."; } return true; } public function register($data) { $rtn = $this->pwRequirementCheck($data['password']); if ($rtn !== true) { return $rtn; } if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { return "Bitte geben Sie eine gültige E-Mail ein."; } $requiredFields = [ 'email', 'password', 'straße', 'hausnr', 'ort', 'postleitzahl', 'land', 'vorname', 'nachname', 'tel' ]; foreach ($requiredFields as $field) { if (empty($data[$field])) { return "Bitte füllen Sie alle Felder aus."; } } if ($this->userExistsByEmail($data['email'])) { return "Ein Account mit dieser E-Mail existiert bereits."; } $hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT); $sql = "INSERT INTO user (email, password, straße, hausnr, ort, postleitzahl, land,vorname, nachname, tel, isAdmin) VALUES (:email, :password, :straße, :hausnr, :ort, :postleitzahl, :land,:vorname, :nachname, :tel, :isAdmin)"; $params = [ ':email' => $data['email'], ':password' => $hashedPassword, ':straße' => $data['straße'], ':hausnr' => $data['hausnr'], ':ort' => $data['ort'], ':postleitzahl'=> $data['postleitzahl'], ':land'=> $data['land'], ':vorname' => $data['vorname'], ':nachname'=> $data['nachname'], ':tel' => $data['tel'], ':isAdmin' => $data['isAdmin'] ? 1 : 0, ]; try { $pdo = $this->linkDB(); $stmt = $pdo->prepare($sql); $stmt->execute($params); return true; } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e); return false; } } private function userExistsByEmail($email) { try { $pdo = $this->linkDB(); $sql = "SELECT userid FROM user WHERE email = :email"; $params = [':email' => $email]; $stmt = $pdo->prepare($sql); $stmt->execute($params); return (bool) $stmt->fetch(); } catch (\PDOException $e) { new \Blog\Library\ErrorMsg("Fehler bei der E-Mail-Prüfung", $e); return false; } } public function pwForgot($email){ $randomPw = bin2hex(random_bytes(12 / 2)); $hashedPassword = password_hash($randomPw, PASSWORD_DEFAULT); $this->forgottenPwUpdate($email, $hashedPassword); $betreff = "Passwort zurücksetzen bei bibArts"; $nachricht = "Hallo,\n\nhier ihr temporäres Passwort:\n\n $randomPw \n\n Bitte beachten Sie, dass das Passwort nur 2 stunden Gülltig ist. \nViele Grüße,\nbibArts Team"; $header = "From: noreply@edu.bib.de\r\n"; $header .= "Content-Type: text/plain; charset=UTF-8\r\n"; $maxTries = 5; $try = 0; $success = false; while ($try < $maxTries && !$success) { $erfolg = mail($email, $betreff, $nachricht, $header); $try++; if (!$erfolg) { error_log("Mailversuch $try an $email fehlgeschlagen."); sleep(1); } } } private function forgottenPwUpdate($email, $hashedPassword) { try{ $pdo = $this->linkDB(); $sqlCheck = "SELECT COUNT(*) FROM user WHERE email = :email"; $stmt = $pdo->prepare($sqlCheck); $stmt->execute([':email' => $email]); if ($stmt->fetchColumn() == 0) { return false; } $validUntil = (new DateTime())->add(new DateInterval('PT2H'))->format('Y-m-d H:i:s'); $sql = "UPDATE user SET password = :password, validUntil = :validUntil WHERE email = :email"; $stmt = $pdo->prepare($sql); return $stmt->execute([ ':email' => $email, ':password' => $hashedPassword, ':validUntil' => $validUntil ]); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren der Daten.", $e); die; return false; } } public function updatePassword($email, $oldpw, $newpw){ if(!$this->login($email, $oldpw)) { return false; } $requiredFields = [$email, $oldpw, $newpw]; foreach ($requiredFields as $field) { if (empty($field)) { return "Bitte füllen Sie alle Felder aus"; } } $hashedPassword = password_hash($newpw, PASSWORD_DEFAULT); $sql = "INSERT INTO user (email, password) VALUES (:email, :password)"; try{ $pdo = $this->linkDB(); $stmt = $pdo->prepare($sql); return $stmt->execute([ ':email' => $email, ':password' => $hashedPassword, ]); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e); die; } } public function checkDoublePw($password1, $password2){ if($password1 === $password2){ return true; } else return false; } }