mirror of
https://gitee.com/spark-store-project/spark-store
synced 2025-12-14 21:02:04 +08:00
fix:提权后30s错误显示提权失败
This commit is contained in:
44
src/main.cpp
44
src/main.cpp
@@ -14,53 +14,41 @@ bool elevateToRoot() {
|
|||||||
QString program = QCoreApplication::applicationFilePath();
|
QString program = QCoreApplication::applicationFilePath();
|
||||||
qDebug() << "Current application path:" << program;
|
qDebug() << "Current application path:" << program;
|
||||||
|
|
||||||
// 获取当前 DISPLAY 和 XAUTHORITY 环境变量
|
|
||||||
QByteArray display = qgetenv("DISPLAY");
|
QByteArray display = qgetenv("DISPLAY");
|
||||||
QByteArray xauthority = qgetenv("XAUTHORITY");
|
QByteArray xauthority = qgetenv("XAUTHORITY");
|
||||||
qDebug() << "DISPLAY:" << display;
|
|
||||||
qDebug() << "XAUTHORITY:" << xauthority;
|
|
||||||
|
|
||||||
// 构造带环境变量的 pkexec 命令
|
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << "env"
|
args << "env"
|
||||||
<< "DISPLAY=" + display
|
<< "DISPLAY=" + display
|
||||||
<< "XAUTHORITY=" + xauthority
|
<< "XAUTHORITY=" + xauthority
|
||||||
<< program;
|
<< program;
|
||||||
|
|
||||||
QProcess *process = new QProcess();
|
QProcess process;
|
||||||
process->setProgram("pkexec");
|
process.setProgram("pkexec");
|
||||||
process->setArguments(args);
|
process.setArguments(args);
|
||||||
|
|
||||||
qDebug() << "Attempting to elevate using pkexec with arguments:" << args;
|
qDebug() << "Attempting to elevate using pkexec with arguments:" << args;
|
||||||
|
|
||||||
// 启动进程并等待完成
|
process.start();
|
||||||
process->start();
|
if (!process.waitForStarted(5000)) {
|
||||||
// 等待 pkexec 完成,通常会弹出密码框
|
qDebug() << "Failed to start pkexec.";
|
||||||
// 设置一个合理的超时时间,例如 30 秒
|
|
||||||
if (!process->waitForFinished(30000)) {
|
|
||||||
qDebug() << "pkexec process timed out.";
|
|
||||||
process->kill(); // 如果超时,终止进程
|
|
||||||
delete process;
|
|
||||||
return false;
|
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 code:" << exitCode;
|
||||||
qDebug() << "pkexec exit status:" << exitStatus;
|
qDebug() << "pkexec exit status:" << exitStatus;
|
||||||
qDebug() << "pkexec standard error:" << process->readAllStandardError();
|
qDebug() << "pkexec stderr:" << process.readAllStandardError();
|
||||||
|
|
||||||
// 检查 pkexec 是否成功
|
return (exitStatus == QProcess::NormalExit && exitCode == 0);
|
||||||
// pkexec 成功执行通常返回 0,或者如果用户取消授权,会返回非零值。
|
|
||||||
// 但是,如果 pkexec 本身执行失败(例如找不到命令),exitStatus 会是 CrashOrKilled
|
|
||||||
// 这里我们认为只要pkexec成功启动了,即使授权失败,也算pkexec命令执行成功了,
|
|
||||||
// 因为这表示pkexec本身是可用的。
|
|
||||||
// 只有当pkexec命令无法执行时,才认为是pkexec的问题
|
|
||||||
bool pkexecCommandExecuted = (exitStatus == QProcess::NormalExit && exitCode == 0);
|
|
||||||
|
|
||||||
delete process;
|
|
||||||
return pkexecCommandExecuted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
|||||||
Reference in New Issue
Block a user