50 lines
1.6 KiB
PHP
50 lines
1.6 KiB
PHP
<?php
|
|
/**
|
|
* staff/session_ping.php
|
|
*
|
|
* Wird vom Frontend per fetch() aufgerufen wenn der Nutzer aktiv ist.
|
|
* Aktualisiert staff_last_activity und gibt die verbleibende Zeit zurück.
|
|
*/
|
|
require_once __DIR__ . '/../includes/bootstrap.php';
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// Nur POST erlauben (Ausnahme: GET ?check=1 fragt nur die Restzeit ab, ohne die Sitzung zu verlängern)
|
|
$checkOnly = ($_GET['check'] ?? '') === '1' && $_SERVER['REQUEST_METHOD'] === 'GET';
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST' && !$checkOnly) {
|
|
http_response_code(405);
|
|
echo json_encode(['error' => 'Method not allowed']);
|
|
exit;
|
|
}
|
|
|
|
// Muss eingeloggt sein
|
|
if (empty($_SESSION['staff_id'])) {
|
|
http_response_code(401);
|
|
echo json_encode(['error' => 'Nicht eingeloggt', 'remaining' => 0]);
|
|
exit;
|
|
}
|
|
|
|
$timeout = (int)(get_setting('staff_session_timeout', '30') ?: 30);
|
|
$last = $_SESSION['staff_last_activity'] ?? 0;
|
|
$elapsed = time() - $last;
|
|
|
|
// Abgelaufen? Dann nicht mehr verlängern
|
|
if ($last && $elapsed > ($timeout * 60)) {
|
|
http_response_code(401);
|
|
echo json_encode(['error' => 'Session abgelaufen', 'remaining' => 0]);
|
|
exit;
|
|
}
|
|
|
|
// Nur Restzeit abfragen (andere Tabs und Hintergrund-Abfragen verlängern nichts)
|
|
if ($checkOnly) {
|
|
echo json_encode(['ok' => true, 'remaining' => max(0, (int) ($timeout * 60 - $elapsed))]);
|
|
exit;
|
|
}
|
|
|
|
// Aktivität erneuern (dieser Ping kommt nur bei echten Klicks, Tipps und Mausbewegungen)
|
|
$_SESSION['staff_last_activity'] = time();
|
|
staff_touch_activity(get_db(), (int) $_SESSION['staff_id']);
|
|
$remaining = $timeout * 60;
|
|
|
|
echo json_encode(['ok' => true, 'remaining' => $remaining]);
|