false, 'message' => 'Method Not Allowed']); exit(); } $input = file_get_contents('php://input'); $data = json_decode($input, true); if (!isset($data['filename'])) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Не указан файл для восстановления']); exit(); } $filename = basename($data['filename']); // Защита от path traversal $backups_dir = __DIR__ . '/../'; $backup_file = $backups_dir . $filename; $current_file = $backups_dir . 'latest.json'; // Проверяем существование файла бэкапа if (!file_exists($backup_file)) { http_response_code(404); echo json_encode(['success' => false, 'message' => 'Файл бэкапа не найден']); exit(); } // Проверяем, что это действительно файл бэкапа if (!preg_match('/^latest\.json\.backup\.\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$/', $filename)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Неверный формат файла']); exit(); } // Создаём бэкап текущей версии перед откатом if (file_exists($current_file)) { $backup_name = 'latest.json.backup.' . date('Y-m-d_H-i-s'); copy($current_file, $backups_dir . $backup_name); } // Восстанавливаем версию из бэкапа if (copy($backup_file, $current_file)) { // Логируем откат $log_dir = $backups_dir . 'logs'; if (!is_dir($log_dir)) { mkdir($log_dir, 0755, true); } $log_entry = sprintf( "[%s] RESTORE: %s -> latest.json (IP: %s)\n", date('Y-m-d H:i:s'), $filename, $_SERVER['REMOTE_ADDR'] ?? 'unknown' ); file_put_contents($log_dir . '/restore.log', $log_entry, FILE_APPEND); // Получаем данные восстановленной версии $restored_data = json_decode(file_get_contents($current_file), true); echo json_encode([ 'success' => true, 'message' => 'Версия успешно восстановлена', 'version' => $restored_data['version'] ?? 'unknown', 'build_number' => $restored_data['build_number'] ?? 0 ]); } else { http_response_code(500); echo json_encode(['success' => false, 'message' => 'Ошибка при восстановлении файла']); }