Files
usbcheck.it/api/v1/result/browser.quick.test.php
2025-12-01 01:24:30 +01:00

202 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// /api/v1/result/browser.quick.test.php
declare(strict_types=1);
/**
* Handler für: /v1/browser.quick.test
*
* Wird vom Router (/api/router/router.v1.php) aufgerufen.
* Erwartung:
* function browser_quick_test_handle_request(): array
*/
function browser_quick_test_handle_request(): array
{
// Session sicherstellen (sollte über fileload.php schon aktiv sein,
// aber doppelt schadlos)
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
// ---------------------------------------------------------------------
// 1. JSON einlesen
// ---------------------------------------------------------------------
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!is_array($data)) {
return [
'ok' => false,
'error' => 'Invalid JSON payload',
];
}
// ---------------------------------------------------------------------
// 2. User / Session ermitteln (robust, mehrere Varianten)
// ---------------------------------------------------------------------
$userId = null;
$isLoggedIn = 0;
// A) Klassisch: user_id direkt in der Session
if (!empty($_SESSION['user_id'])) {
$userId = (int)$_SESSION['user_id'];
}
// B) Dein aktuelles Login verwendet $_SESSION['user']['id']
elseif (!empty($_SESSION['user']) && is_array($_SESSION['user']) && !empty($_SESSION['user']['id'])) {
$userId = (int)$_SESSION['user']['id'];
}
// C) Optionaler auth-Block
elseif (!empty($_SESSION['auth']) && is_array($_SESSION['auth']) && !empty($_SESSION['auth']['user_id'])) {
$userId = (int)$_SESSION['auth']['user_id'];
}
if ($userId) {
$isLoggedIn = 1;
}
$sessionId = session_id() ?: null;
$ipAddress = $_SERVER['REMOTE_ADDR'] ?? null;
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null;
// ---------------------------------------------------------------------
// 3. Grobe Auswertung aus dem Report (optional)
// ---------------------------------------------------------------------
$modeRequested = $data['mode_requested'] ?? 'unknown';
$meta = $data['meta'] ?? [];
// Browser/OS vorerst leer, später per Parser füllen
$browserName = null;
$browserVersion = null;
$osName = null;
$osVersion = null;
// 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 aktuell noch nicht separat ermittelt
$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 (roher JSON-String)
$testReportJson = $raw ?: json_encode($data, JSON_UNESCAPED_UNICODE);
// ---------------------------------------------------------------------
// 4. Insert in web_quicktests
// ---------------------------------------------------------------------
/** @var PDO $pdo */
global $pdo;
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,
:advertised_capacity_bytes,
:measured_capacity_bytes,
:capacity_status,
:filesystem,
:test_report_json,
:ip_address,
:session_id
)
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
'user_id' => $userId, // <- hier sollte 1 stehen, wenn eingeloggt
'is_logged_in' => $isLoggedIn,
'usb_device_id' => null,
'browser_name' => $browserName,
'browser_version' => $browserVersion,
'os_name' => $osName,
'os_version' => $osVersion,
'volume_label' => $volumeLabel,
'manufacturer' => $manufacturer,
'model_name' => $modelName,
'usb_type' => $usbType,
'advertised_capacity_bytes' => $advCapacityBytes,
'measured_capacity_bytes' => $measuredBytes ?: null,
'capacity_status' => $capacityStatus,
'filesystem' => $filesystem,
'test_report_json' => $testReportJson,
'ip_address' => $ipAddress,
'session_id' => $sessionId,
]);
$id = (int)$pdo->lastInsertId();
// DEBUG: damit wir im Frontend/NW-Tab sehen, was der Handler glaubt
return [
'ok' => true,
'id' => $id,
'mode' => $modeRequested,
'measured_bytes' => $measuredBytes ?: null,
// Debug-Felder später für PROD wieder rauswerfen
'debug_user_id' => $userId,
'debug_is_logged_in' => $isLoggedIn,
'debug_session_id' => $sessionId,
'debug_session_has_user' => isset($_SESSION['user']),
'debug_session_user' => $_SESSION['user'] ?? null,
];
} catch (Throwable $e) {
error_log('[usbcheck] web_quicktests insert failed: ' . $e->getMessage());
return [
'ok' => false,
'error' => 'DB error',
'debug' => $e->getMessage(),
];
}
}