false, 'message' => "Environment file not found" ]); exit; } try { $envDir = dirname($envFile); $dotenv = Dotenv::createImmutable($envDir, '.env.pw-encryption-key'); $dotenv->load(); } catch (Throwable $e) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => "Dotenv error" ]); } $password = trim($_POST['password1']); $passwordRep = trim($_POST['password2']); if ($password === '' || $passwordRep === '') { return 'Beide Felder müssen ausgefüllt sein'; } if ($password !== $passwordRep) { return 'Beide Passwörter müssen identisch sein'; } $hash = password_hash($password, PASSWORD_ARGON2ID); $iv_length = openssl_cipher_iv_length('aes-256-cbc'); $iv = random_bytes($iv_length); $encrypted = openssl_encrypt( 'SET_BY_OTL', 'aes-256-cbc', $_ENV['PW_ENCRYPTION_KEY'], 0, $iv ); $cipher_store = base64_encode($iv . $encrypted); return ['success' => true, 'hash' => $hash, 'encpw' => $cipher_store]; } public function logIn(int $id) { global $baseDir; $mysqli = $this->connectToDB(); require $baseDir . '/../scripts/db/db-tables.php'; // delete the one-time token if (!isset($_SESSION['otl_dbid'])) { return 'Interner Fehler'; } $dbid = intval($_SESSION['otl_dbid']); $stmt = $mysqli->prepare("DELETE FROM $tableOTL WHERE id = ?"); $stmt->bind_param("i", $dbid); if (!$stmt->execute()) { return "DB Error"; } $stmt->close(); $sql = "SELECT freigabe FROM $tableInternUsers WHERE id = ?"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $freigabe = $row['freigabe']; $stmt->close(); $mysqli->close(); unset($_SESSION['set_new_password_id_user'], $_SESSION['set_new_password_granted'], $_SESSION['otl_dbid']); $freigabenArray = json_decode($freigabe, true) ?? []; $freigabenTypeArray = $freigabenArray['types'] ?? []; if (count($freigabenTypeArray) > 0) { $_SESSION = array(); session_destroy(); session_start(); } foreach ($freigabenTypeArray as $freigabeType){ $_SESSION['access_granted_'.$freigabeType] = true; $_SESSION['user_id_'.$freigabeType] = $id; } var_dump($_SESSION); if (in_array('wk_leitung', $freigabenTypeArray)) { header("Location: /intern/wk-leitung/logindata"); exit; } elseif (in_array('trainer', $freigabenTypeArray)) { header("Location: /intern/trainer"); exit; } elseif (in_array('kampfrichter', $freigabenTypeArray)) { header("Location: /intern/kampfrichter"); exit; } else { return 'Dieser Benutzer hat keine Berechtigungen.'; } } public function resetPW() { global $baseDir; $iduser = intval($_POST['user_id']); // security: user must have passed one-time-login first if (empty($_SESSION['set_new_password_id_user']) || empty($_SESSION['set_new_password_granted']) || $_SESSION['set_new_password_id_user'] !== $iduser || $_SESSION['set_new_password_granted'] !== true) { http_response_code(403); exit; } require $baseDir . '/../scripts/db/db-tables.php'; $mysqli = $this->connectToDB(); $pwArray = $this->pwProcessing(); if (!isset($pwArray['success']) || !$pwArray['success']) { return 'Passwort konnte nicht verarbeitet werden'; } // update password $updateResult = db_update($mysqli, $tableInternUsers, ['password_hash' => $pwArray['hash'] ?? '', 'password_cipher' => $pwArray['encpw'] ?? '', 'edited_by' => 'otlogin'], ['id' => $iduser]); if ($updateResult === false) { return 'Passwork konnte nicht neu gesetzt werden'; } // delete the one-time token if (!isset($_SESSION['otl_dbid'])) { return 'Interner Fehler'; } $dbid = intval($_SESSION['otl_dbid']); $stmt = $mysqli->prepare("DELETE FROM $tableOTL WHERE id = ?"); $stmt->bind_param("i", $dbid); if (!$stmt->execute()) { return "DB Error"; } $stmt->close(); $this->logIn($iduser); } public function createUser() { global $baseDir; $iduser = intval($_POST['user_id']); if (empty($_SESSION['set_new_user_id_user']) || empty($_SESSION['set_new_user_granted']) || $_SESSION['set_new_user_id_user'] !== $iduser || $_SESSION['set_new_user_granted'] !== true) { http_response_code(403); exit; } require $baseDir . '/../scripts/db/db-tables.php'; $mysqli = $this->connectToDB(); $arrayDB = []; if (isset($_POST['password1'], $_POST['password2'])) { $pwArray = $this->pwProcessing(); if (!isset($pwArray['success']) || !$pwArray['success']) { return 'Passwort konnte nicht verarbeitet werden'; } $arrayDB[] = ["name" => 'password_hash', "value" => $pwArray['hash']]; $arrayDB[] = ["name" => 'password_cipher', "value" => $pwArray['encpw']]; } if (isset($_POST['username'])) { $arrayDB[] = ["name" => 'username', "value" => htmlspecialchars(trim($_POST['username']))]; } if (isset($_POST['name_person'])) { $arrayDB[] = ["name" => 'name_person', "value" => htmlspecialchars(trim($_POST['name_person']))]; } // --- NEW LOGIC TO UTILIZE $arrayDB --- $updateData = [ 'edited_by' => 'otlogin', 'login_active' => 1 ]; // Convert the $arrayDB list into a flat associative array if (!empty($arrayDB)) { foreach ($arrayDB as $entry) { $updateData[$entry['name']] = $entry['value']; } } // Execute update using the dynamically built array $updateResult = db_update( $mysqli, $tableInternUsers, $updateData, ['id' => $iduser] ); if ($updateResult === false) { return 'Nutzer konnte nicht aktualisiert werden'; } $this->logIn($iduser); } } $pwClass = New otl(); /* ============================================================ PASSWORD SET ON POST ============================================================ */ /* ============================================================ ONE-TIME-LOGIN VALIDATION (GET) ============================================================ */ require $baseDir .'/../scripts/db/db-verbindung-script-guest.php'; // fetch one-time login record $result = db_select( $guest, $tableOTL, 'id, user_id, `type`', 'url = ? AND timestamp >= NOW() - INTERVAL 24 HOUR', [$oturl] ); if (!$result || count($result) !== 1) { echo 'forbidden'; http_response_code(403); exit; } $dbid = intval($result[0]['id']); $iduser = intval($result[0]['user_id']); if (isset($_POST['password1'], $_POST['password2'], $_POST['setpasswordbtn'], $_POST['user_id']) && $result[0]['type'] === 'pwreset') { $error = $pwClass->resetPW() ?? ''; } elseif (isset($_POST['setpasswordbtn'], $_POST['user_id']) && $result[0]['type'] === 'create_profile') { $error = $pwClass->createUser() ?? ''; } // store dbid for later deletion $_SESSION['otl_dbid'] = $dbid; if ($result[0]['type'] === 'login') { $pwClass->logIn($iduser); } if ($result[0]['type'] === 'pwreset') { $userinfo = db_select($guest, $tableInternUsers, 'username', 'id = ?', [$iduser]); $username = $userinfo[0]['username']; if (!$userinfo || count($userinfo) !== 1) { echo 'Ungültige Benutzerinformationen'; exit; } // set session token that grants password reset $_SESSION['set_new_password_id_user'] = $iduser; $_SESSION['set_new_password_granted'] = true; $hasUsername = true; $hasName = true; } elseif ($result[0]['type'] === 'create_profile') { $userinfo = db_select($guest, $tableInternUsers, 'username, `password_hash`, `name_person`', 'id = ?', [$iduser]); if (!$userinfo || count($userinfo) !== 1) { echo 'Ungültige Benutzerinformationen'; exit; } $hasPW = $userinfo[0]['password_hash'] !== null; $hasUsername = $userinfo[0]['username'] !== ''; $username = $userinfo[0]['username']; $hasName = $userinfo[0]['name_person'] !== ''; unset($userinfo); // set session token that grants password reset $_SESSION['set_new_user_id_user'] = $iduser; $_SESSION['set_new_user_granted'] = true; } // fetch user $guest->close(); ?> Einmal Login
*/ ?>