From 0b1791995cf05547aa85bedf9e2dd8e7b491dbd0 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Sun, 30 Nov 2025 01:08:20 +0100 Subject: [PATCH] sad --- api/result/browser-quick-test.php | 179 ++++++++++++++++++++++++------ sql.schema | 55 +++++++++ 2 files changed, 199 insertions(+), 35 deletions(-) diff --git a/api/result/browser-quick-test.php b/api/result/browser-quick-test.php index c49b3bb..fd2d8b2 100644 --- a/api/result/browser-quick-test.php +++ b/api/result/browser-quick-test.php @@ -1,56 +1,165 @@ 'not_authenticated']); - exit; -} +// DB einbinden – bitte Pfad an DEINE Struktur anpassen! +require __DIR__ . '/../../inc/db.php'; // z.B. stellt $pdo (PDO) bereit -$userId = (int)$_SESSION['user_id']; +header('Content-Type: application/json; charset=utf-8'); -// JSON einlesen +// --------------------------------------------------------------------- +// 1. JSON einlesen +// --------------------------------------------------------------------- $raw = file_get_contents('php://input'); $data = json_decode($raw, true); if (!is_array($data)) { http_response_code(400); - echo json_encode(['error' => 'invalid_json']); + echo json_encode([ + 'ok' => false, + 'error' => 'Invalid JSON payload', + ]); exit; } -// Minimale Validierung -$mode = $data['mode_requested'] ?? null; -$totalDuration = $data['total_duration_s'] ?? null; +// --------------------------------------------------------------------- +// 2. User / Session ermitteln +// --------------------------------------------------------------------- +$userId = $_SESSION['user_id'] ?? null; // abhängig von deiner Login-Implementierung +$isLoggedIn = $userId ? 1 : 0; +$sessionId = session_id() ?: null; -// DB: Beispiel (mysqli/PDO – hier PDO angenommen) -$db = get_db_connection(); // implementiere in deiner config +$ipAddress = $_SERVER['REMOTE_ADDR'] ?? null; +$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null; -$stmt = $db->prepare(" - INSERT INTO usb_results_browser - (user_id, mode, total_duration_s, report_json, created_at) - VALUES - (:user_id, :mode, :total_duration_s, :report_json, NOW()) -"); +// --------------------------------------------------------------------- +// 3. Grobe Auswertung aus dem Report (optional) +// → vorerst alles im JSON speichern, Felder in web_quicktests eher neutral lassen +// --------------------------------------------------------------------- -$stmt->execute([ - ':user_id' => $userId, - ':mode' => $mode, - ':total_duration_s'=> $totalDuration, - ':report_json' => json_encode($data, JSON_UNESCAPED_UNICODE), -]); +$modeRequested = $data['mode_requested'] ?? 'unknown'; +$meta = $data['meta'] ?? []; -$id = (int)$db->lastInsertId(); +// Hier könntest du später Browser/OS parsen +$browserName = null; +$browserVersion = null; +$osName = null; +$osVersion = null; -header('Content-Type: application/json; charset=utf-8'); -echo json_encode([ - 'status' => 'ok', - 'id' => $id, -]); +// Beispiel: Gesamtmenge geschriebener/verifizierter Bytes aggregieren +$measuredBytes = 0; +if (!empty($data['quick']) && is_array($data['quick'])) { + $measuredBytes += (int)($data['quick']['size_bytes'] ?? 0); +} +if (!empty($data['benchmark']) && is_array($data['benchmark'])) { + $measuredBytes += (int)($data['benchmark']['size_bytes'] ?? 0); +} +if (!empty($data['writeverify']) && is_array($data['writeverify'])) { + $measuredBytes += (int)($data['writeverify']['total_bytes'] ?? 0); +} +// Kapazitätsstatus vorerst neutral +$capacityStatus = 'unknown'; + +// Volume-/Stick-Daten hast du aktuell im Browser noch nicht separat, +// darum bleiben diese Felder (erstmal) NULL: +$volumeLabel = null; +$manufacturer = null; +$modelName = null; +$usbType = null; +$filesystem = null; + +// advertised_capacity_bytes kennen wir im Browser noch nicht: +$advCapacityBytes = null; + +// test_report_json = kompletter Report +$testReportJson = $raw; // direkt als JSON-String speichern + +// --------------------------------------------------------------------- +// 4. Insert in web_quicktests +// --------------------------------------------------------------------- +try { + $sql = " + INSERT INTO web_quicktests ( + user_id, + is_logged_in, + usb_device_id, + browser_name, + browser_version, + os_name, + os_version, + volume_label, + manufacturer, + model_name, + usb_type, + advertised_capacity_bytes, + measured_capacity_bytes, + capacity_status, + filesystem, + test_report_json, + ip_address, + session_id + ) + VALUES ( + :user_id, + :is_logged_in, + :usb_device_id, + :browser_name, + :browser_version, + :os_name, + :os_version, + :volume_label, + :manufacturer, + :model_name, + :usb_type, + :adv_capacity, + :measured_capacity, + :capacity_status, + :filesystem, + CAST(:test_report_json AS JSON), + :ip_address, + :session_id + ) + "; + + $stmt = $pdo->prepare($sql); + + $stmt->execute([ + 'user_id' => $userId, + 'is_logged_in' => $isLoggedIn, + 'usb_device_id' => null, // Browser-Test ist erstmal nicht an gespeicherten Stick gekoppelt + 'browser_name' => $browserName, + 'browser_version' => $browserVersion, + 'os_name' => $osName, + 'os_version' => $osVersion, + 'volume_label' => $volumeLabel, + 'manufacturer' => $manufacturer, + 'model_name' => $modelName, + 'usb_type' => $usbType, + 'adv_capacity' => $advCapacityBytes, + 'measured_capacity' => $measuredBytes ?: null, + 'capacity_status' => $capacityStatus, + 'filesystem' => $filesystem, + 'test_report_json' => $testReportJson, + 'ip_address' => $ipAddress, + 'session_id' => $sessionId, + ]); + + $id = (int)$pdo->lastInsertId(); + + echo json_encode([ + 'ok' => true, + 'id' => $id, + ]); +} catch (Throwable $e) { + http_response_code(500); + echo json_encode([ + 'ok' => false, + 'error' => 'DB error', + // 'debug' => $e->getMessage(), // nur zum Debuggen aktivieren + ]); +} diff --git a/sql.schema b/sql.schema index a2a5768..1dc2926 100644 --- a/sql.schema +++ b/sql.schema @@ -109,3 +109,58 @@ CREATE TABLE IF NOT EXISTS usb_tests ( FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); + + +-- ============================================================ +-- WEB QUICKTESTS – Browser-Schnellcheck (Gast + eingeloggt) +-- Ergebnisse können anonym oder usergebunden sein. +-- ============================================================ + +CREATE TABLE IF NOT EXISTS web_quicktests ( + id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + + -- Zuordnung zum Nutzer (NULL = anonym) + user_id BIGINT UNSIGNED NULL, + is_logged_in TINYINT(1) NOT NULL DEFAULT 0, + + -- optional: Zuordnung zu einem gespeicherten Stick (falls vorhanden) + usb_device_id BIGINT UNSIGNED NULL, + + -- Umgebung (für Statistik / Debug) + browser_name VARCHAR(100) NULL, + browser_version VARCHAR(50) NULL, + os_name VARCHAR(100) NULL, + os_version VARCHAR(50) NULL, + + -- Stick-Infos aus dem Schnelldurchlauf (soweit ermittelbar) + volume_label VARCHAR(255) NULL, -- z.B. "USB DISK", "NO NAME" + manufacturer VARCHAR(255) NULL, + model_name VARCHAR(255) NULL, + usb_type ENUM('USB 2.0', 'USB 3.0', 'USB 3.1', 'USB 3.2', 'USB 4.0') NULL, + + -- Kapazitätsdaten (Hersteller vs. gemessen im Schnellcheck) + advertised_capacity_bytes BIGINT UNSIGNED NULL, + measured_capacity_bytes BIGINT UNSIGNED NULL, + + capacity_status ENUM('unknown', 'ok', 'suspicious', 'fake') + NOT NULL DEFAULT 'unknown', + + filesystem VARCHAR(64) NULL, + + -- Detaildaten (z.B. Block-Infos, Logs, Messpunkte) + test_report_json JSON NULL, + + -- Meta + ip_address VARCHAR(45) NULL, + session_id VARCHAR(64) NULL, + + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP + ON UPDATE CURRENT_TIMESTAMP, + + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE, + + FOREIGN KEY (usb_device_id) REFERENCES usb_devices(id) + ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;