#pragma once #include #include #include namespace UpdateClient { inline bool isRuntimeProtectedPath(const QString& path, const QString& runtimeRelativePath) { const QString normalizedPath = QDir::cleanPath(QDir::fromNativeSeparators(path)).toCaseFolded(); static const QSet installerManagedRootFiles{ QStringLiteral("components.xml"), QStringLiteral("installationlog.txt"), QStringLiteral("installer.dat"), QStringLiteral("maintenancetool.dat"), QStringLiteral("maintenancetool.exe"), QStringLiteral("maintenancetool.ini"), QStringLiteral("network.xml") }; if (installerManagedRootFiles.contains(normalizedPath) || normalizedPath.startsWith(QStringLiteral("installerresources/")) || normalizedPath.startsWith(QStringLiteral("licenses/"))) return true; static const QSet runtimeProtectedPaths{ QStringLiteral("bootstrap.exe"), QStringLiteral("client.ini"), QStringLiteral("config/app_config.json"), QStringLiteral("config/local_state.json"), QStringLiteral("config/client_identity.dat"), QStringLiteral("config/version_policy.dat") }; if (runtimeProtectedPaths.contains(normalizedPath)) return true; QString runtimePrefix = QDir::cleanPath( QDir::fromNativeSeparators(runtimeRelativePath)).toCaseFolded(); if (runtimePrefix.isEmpty() || runtimePrefix == QStringLiteral(".")) return false; while (runtimePrefix.startsWith(QStringLiteral("./"))) runtimePrefix.remove(0, 2); for (const QString& protectedPath : runtimeProtectedPaths) { if (normalizedPath == runtimePrefix + QLatin1Char('/') + protectedPath) return true; } return false; } }