This commit is contained in:
2025-11-30 01:08:20 +01:00
parent 1ba6ac5111
commit 0b1791995c
2 changed files with 199 additions and 35 deletions

View File

@@ -1,56 +1,165 @@
<?php <?php
// public/api/results/save-browser-test.php // /public/api/result/browser-quick-test.php
// Achtung: Passe Pfad und Bootstrapping an dein Projekt an!
declare(strict_types=1);
require __DIR__ . '/../../../config/fileload.php';
session_start(); session_start();
// Nur eingeloggte User // DB einbinden bitte Pfad an DEINE Struktur anpassen!
if (empty($_SESSION['user_id'])) { require __DIR__ . '/../../inc/db.php'; // z.B. stellt $pdo (PDO) bereit
http_response_code(401);
echo json_encode(['error' => 'not_authenticated']);
exit;
}
$userId = (int)$_SESSION['user_id']; header('Content-Type: application/json; charset=utf-8');
// JSON einlesen // ---------------------------------------------------------------------
// 1. JSON einlesen
// ---------------------------------------------------------------------
$raw = file_get_contents('php://input'); $raw = file_get_contents('php://input');
$data = json_decode($raw, true); $data = json_decode($raw, true);
if (!is_array($data)) { if (!is_array($data)) {
http_response_code(400); http_response_code(400);
echo json_encode(['error' => 'invalid_json']); echo json_encode([
'ok' => false,
'error' => 'Invalid JSON payload',
]);
exit; exit;
} }
// Minimale Validierung // ---------------------------------------------------------------------
$mode = $data['mode_requested'] ?? null; // 2. User / Session ermitteln
$totalDuration = $data['total_duration_s'] ?? null; // ---------------------------------------------------------------------
$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) $ipAddress = $_SERVER['REMOTE_ADDR'] ?? null;
$db = get_db_connection(); // implementiere in deiner config $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null;
$stmt = $db->prepare(" // ---------------------------------------------------------------------
INSERT INTO usb_results_browser // 3. Grobe Auswertung aus dem Report (optional)
(user_id, mode, total_duration_s, report_json, created_at) // → vorerst alles im JSON speichern, Felder in web_quicktests eher neutral lassen
VALUES // ---------------------------------------------------------------------
(:user_id, :mode, :total_duration_s, :report_json, NOW())
");
$stmt->execute([ $modeRequested = $data['mode_requested'] ?? 'unknown';
':user_id' => $userId, $meta = $data['meta'] ?? [];
':mode' => $mode,
':total_duration_s'=> $totalDuration,
':report_json' => json_encode($data, JSON_UNESCAPED_UNICODE),
]);
$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'); // Beispiel: Gesamtmenge geschriebener/verifizierter Bytes aggregieren
echo json_encode([ $measuredBytes = 0;
'status' => 'ok',
'id' => $id,
]);
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
]);
}

View File

@@ -109,3 +109,58 @@ CREATE TABLE IF NOT EXISTS usb_tests (
FOREIGN KEY (user_id) REFERENCES users(id) FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE 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;