": ["Category/script.sh", …], …}> // // RESPONSE // {"ok":true} // {"ok":false,"error":"POST only"|"Invalid JSON"|"Write failed"} // // DEPENDS ON // include/scheduler.php vv_schedule_load(), vv_schedule_save() // ═══════════════════════════════════════════════════════════════════════════════════════════════ header('Content-Type: application/json'); require_once dirname(__DIR__) . '/include/config.php'; require_once dirname(__DIR__) . '/include/scheduler.php'; if ($_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(['ok' => false, 'error' => 'POST only']); exit; } $raw = $_POST['folders'] ?? ''; $decoded = json_decode($raw, true); if (!is_array($decoded)) { echo json_encode(['ok' => false, 'error' => 'Invalid JSON']); exit; } $clean = []; foreach ($decoded as $name => $scripts) { $name = trim((string)$name); if (!$name || strlen($name) > 80) continue; if (!is_array($scripts)) continue; $cleanScripts = []; foreach ($scripts as $s) { $s = trim((string)$s); if (!$s || str_contains($s, '..') || !preg_match('/^[A-Za-z0-9_.\-\/]+\.sh$/', $s)) continue; $cleanScripts[] = $s; } $clean[$name] = $cleanScripts; } $schedule = vv_schedule_load(); $schedule['__folders'] = $clean; if (!vv_schedule_save($schedule)) { echo json_encode(['ok' => false, 'error' => 'Write failed']); exit; } echo json_encode(['ok' => true]);