#include "ignoreconfig.h" #include #include #include #include #include #include // for geteuid IgnoreConfig::IgnoreConfig(QObject *parent) : QObject(parent) { // 设置配置文件路径 QString configDir; // // 检查是否以 root 权限运行 // if (geteuid() == 0) { // // 首先检查是否有 SUDO_USER_HOME 环境变量(表示是通过 pkexec 提权的普通用户) // QByteArray sudoUserHomeEnv = qgetenv("SUDO_USER_HOME"); // if (!sudoUserHomeEnv.isEmpty()) { // // 通过 pkexec 提权的普通用户,使用原用户的配置目录 // QString sudoUserHomePath = QString::fromLocal8Bit(sudoUserHomeEnv); // configDir = sudoUserHomePath + "/.config"; // } else { // // 获取实际的 HOME 目录来判断是真正的 root 用户还是其他方式提权的用户 // QByteArray homeEnv = qgetenv("HOME"); // QString homePath = QString::fromLocal8Bit(homeEnv); // if (homePath == "/root") { // // 真正的 root 用户,使用 /root/.config // configDir = "/root/.config"; // } else { // // 其他方式提权的用户,使用 HOME 目录下的配置 // configDir = homePath + "/.config"; // } // } // } else { // // 普通用户,使用标准配置目录 // configDir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); // } configDir = "/etc/"; QDir dir(configDir); if (!dir.exists()) { dir.mkpath("."); } m_configFilePath = dir.filePath("spark-update-tool/ignored_apps.conf"); // 确保目录存在 QFileInfo fileInfo(m_configFilePath); QDir configDirPath = fileInfo.dir(); if (!configDirPath.exists()) { configDirPath.mkpath("."); } // 加载现有配置 loadConfig(); // 输出忽略列表到 qDebug printIgnoredApps(); } void IgnoreConfig::addIgnoredApp(const QString &packageName, const QString &version) { m_ignoredApps.insert(qMakePair(packageName, version)); saveConfig(); } void IgnoreConfig::removeIgnoredApp(const QString &packageName) { // 移除所有该包名的版本 auto it = m_ignoredApps.begin(); while (it != m_ignoredApps.end()) { if (it->first == packageName) { it = m_ignoredApps.erase(it); } else { ++it; } } saveConfig(); } bool IgnoreConfig::isAppIgnored(const QString &packageName, const QString &version) const { return m_ignoredApps.contains(qMakePair(packageName, version)); } QSet> IgnoreConfig::getIgnoredApps() const { return m_ignoredApps; } void IgnoreConfig::printIgnoredApps() const { qDebug() << "=== 忽略的应用列表 ==="; qDebug() << "配置文件路径:" << m_configFilePath; if (m_ignoredApps.isEmpty()) { qDebug() << "没有忽略的应用"; } else { for (const auto &app : m_ignoredApps) { qDebug() << "忽略的应用:" << app.first << "版本:" << app.second; } } qDebug() << "===================="; } bool IgnoreConfig::saveConfig() { QFile file(m_configFilePath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "无法打开配置文件进行写入:" << m_configFilePath; return false; } QTextStream out(&file); for (const auto &app : m_ignoredApps) { out << app.first << "|" << app.second << "\n"; } file.close(); return true; } bool IgnoreConfig::loadConfig() { QFile file(m_configFilePath); if (!file.exists()) { // 配置文件不存在,这是正常的,返回true表示没有错误 return true; } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "无法打开配置文件进行读取:" << m_configFilePath; return false; } m_ignoredApps.clear(); QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine().trimmed(); if (!line.isEmpty()) { QStringList parts = line.split('|'); if (parts.size() == 2) { m_ignoredApps.insert(qMakePair(parts[0], parts[1])); } } } file.close(); return true; }