#include #include #include #include #include #include #include #include #include "MainWindow.h" #include "../Common/ConfigHelper.h" #include "../Common/PolicyHelper.h" #include "../Common/LocalStateHelper.h" int main(int argc, char* argv[]) { SetConsoleOutputCP(936); QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QApplication a(argc, argv); qDebug() << Qt::endl << "entered main app" << Qt::endl; const QString validToken = ConfigHelper::instance().getValue("App", "launch_token"); bool pass = false; QString healthFilePath; for (int i = 0; i < argc; ++i) { QString arg(argv[i]); if (arg.startsWith("--launcher-token=")) { QString tk = arg.split("=").last(); if (tk == validToken) { pass = true; } } else if (arg.startsWith("--health-file=")) { healthFilePath = arg.mid(QString("--health-file=").size()); } } if (!pass) { QMessageBox::critical(nullptr, "Startup Restriction", "Direct double-clicking MainApp.exe is prohibited. Please use Launcher.exe to open the software!"); return -1; } QString appDir = QApplication::applicationDirPath(); PolicyHelper policy(appDir); if (!policy.loadPolicy("config/version_policy.dat") || !policy.isValid()) { QMessageBox::critical(nullptr, "Policy Error", QString("Local policy invalid: %1").arg(policy.errorString())); return -1; } if (policy.isExpired()) { QMessageBox::critical(nullptr, "Policy Error", "Policy expired, cannot start the application."); return -1; } LocalStateHelper state(appDir); if (!state.loadState()) { QMessageBox::critical(nullptr, "State Error", QString("Cannot load local state: %1").arg(state.errorString())); return -1; } if (state.isPolicySeqRolledBack(policy.policySeq())) { QMessageBox::critical(nullptr, "Policy Error", "Detected policy sequence rollback, startup blocked."); return -1; } if (state.isSystemTimeRewound()) { QMessageBox::critical(nullptr, "Policy Error", "System time appears to be rewound, startup blocked."); return -1; } MainWindow w; w.show(); state.updateAfterSuccessfulRun(ConfigHelper::instance().getValue("App", "current_version"), policy.policySeq()); if (!state.saveState()) { QMessageBox::critical(nullptr, "State Error", QString("Cannot save local state: %1").arg(state.errorString())); return -1; } if (!healthFilePath.isEmpty()) { QDir().mkpath(QFileInfo(healthFilePath).path()); QSaveFile healthFile(healthFilePath); const QByteArray healthy("ok\n"); if (!healthFile.open(QIODevice::WriteOnly) || healthFile.write(healthy) != healthy.size() || !healthFile.commit()) { QMessageBox::critical(nullptr, "Startup Error", "Cannot write update health confirmation file."); return -1; } } qDebug() << "Main program MainApp is running normally"; return a.exec(); }