From 4018e526c6e540fbc04f8cf8f59697fa500d89ff Mon Sep 17 00:00:00 2001 From: momen Date: Sun, 22 Jun 2025 15:26:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=8F=90=E6=9D=83=E5=90=8E30s=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=98=BE=E7=A4=BA=E6=8F=90=E6=9D=83=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 71c172d..c834b96 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,53 +14,41 @@ bool elevateToRoot() { QString program = QCoreApplication::applicationFilePath(); qDebug() << "Current application path:" << program; - // 获取当前 DISPLAY 和 XAUTHORITY 环境变量 QByteArray display = qgetenv("DISPLAY"); QByteArray xauthority = qgetenv("XAUTHORITY"); - qDebug() << "DISPLAY:" << display; - qDebug() << "XAUTHORITY:" << xauthority; - // 构造带环境变量的 pkexec 命令 QStringList args; args << "env" << "DISPLAY=" + display << "XAUTHORITY=" + xauthority << program; - QProcess *process = new QProcess(); - process->setProgram("pkexec"); - process->setArguments(args); + QProcess process; + process.setProgram("pkexec"); + process.setArguments(args); qDebug() << "Attempting to elevate using pkexec with arguments:" << args; - // 启动进程并等待完成 - process->start(); - // 等待 pkexec 完成,通常会弹出密码框 - // 设置一个合理的超时时间,例如 30 秒 - if (!process->waitForFinished(30000)) { - qDebug() << "pkexec process timed out."; - process->kill(); // 如果超时,终止进程 - delete process; + process.start(); + if (!process.waitForStarted(5000)) { + qDebug() << "Failed to start pkexec."; return false; } - int exitCode = process->exitCode(); - QProcess::ExitStatus exitStatus = process->exitStatus(); + // 阻塞等待提权进程退出(比如主程序窗口关闭) + if (!process.waitForFinished(-1)) { // 等待直到新进程退出 + qDebug() << "pkexec process waitForFinished failed."; + return false; + } + + int exitCode = process.exitCode(); + QProcess::ExitStatus exitStatus = process.exitStatus(); qDebug() << "pkexec exit code:" << exitCode; qDebug() << "pkexec exit status:" << exitStatus; - qDebug() << "pkexec standard error:" << process->readAllStandardError(); + qDebug() << "pkexec stderr:" << process.readAllStandardError(); - // 检查 pkexec 是否成功 - // pkexec 成功执行通常返回 0,或者如果用户取消授权,会返回非零值。 - // 但是,如果 pkexec 本身执行失败(例如找不到命令),exitStatus 会是 CrashOrKilled - // 这里我们认为只要pkexec成功启动了,即使授权失败,也算pkexec命令执行成功了, - // 因为这表示pkexec本身是可用的。 - // 只有当pkexec命令无法执行时,才认为是pkexec的问题 - bool pkexecCommandExecuted = (exitStatus == QProcess::NormalExit && exitCode == 0); - - delete process; - return pkexecCommandExecuted; + return (exitStatus == QProcess::NormalExit && exitCode == 0); } int main(int argc, char *argv[])