From 6b162442e9316d1be5704e1fef7327bde28489e9 Mon Sep 17 00:00:00 2001 From: ZhangTingan Date: Tue, 19 May 2026 13:23:38 +0800 Subject: [PATCH 1/2] fix: handle password prompt and missing list in long filename extraction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add password detection in handleLongNameExtract() for content-encrypted archives to prevent UI freeze - Remove FILE_MAX_SIZE check so right-click extract always lists first, ensuring long filename prescan has archive data available Log: fix bug Bug:https://pms.uniontech.com//bug-view-361845.html --- .../archiveinterface/cliinterface.cpp | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/3rdparty/interface/archiveinterface/cliinterface.cpp b/3rdparty/interface/archiveinterface/cliinterface.cpp index 9ca201e8..d6d158f9 100644 --- a/3rdparty/interface/archiveinterface/cliinterface.cpp +++ b/3rdparty/interface/archiveinterface/cliinterface.cpp @@ -117,7 +117,7 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const m_extractOptions = options; if (!bLnfs) { - if (arcData.listRootEntry.isEmpty() && options.qSize < FILE_MAX_SIZE) { + if (arcData.listRootEntry.isEmpty()) { emit signalprogress(1); setProperty("list", "tmpList"); list(); @@ -1287,7 +1287,51 @@ bool CliInterface::handleLongNameExtract(const QList &files) pProcess->setProgram(m_cliProps->property("extractProgram").toString(), m_cliProps->extractArgs(absoluteDestinationPath, fileList, false, password)); pProcess->start(); - pProcess->waitForFinished(-1); + + // 检测加密文件解压时的密码提示,避免进程卡死 + if (password.isEmpty()) { + bool bPasswordEntered = false; + while (!pProcess->waitForFinished(200)) { + if (pProcess->bytesAvailable() > 0) { + QByteArray output = pProcess->readAllStandardOutput(); + QStringList lines = QString::fromLocal8Bit(output).split('\n'); + for (const QString &line : lines) { + if (isPasswordPrompt(line)) { + pProcess->kill(); + pProcess->waitForFinished(3000); + + PasswordNeededQuery query(m_strArchiveName); + emit signalQuery(&query); + query.waitForResponse(); + + if (query.responseCancelled()) { + m_eErrorType = ET_NeedPassword; + return false; + } + + password = query.password(); + DataManager::get_instance().archiveData().strPassword = password; + + // 带密码参数重新启动解压进程 + pProcess->setPtyChannels(KPtyProcess::StdinChannel); + pProcess->setOutputChannelMode(KProcess::MergedChannels); + pProcess->setNextOpenMode(QIODevice::ReadWrite | QIODevice::Unbuffered | QIODevice::Text); + pProcess->setProgram(m_cliProps->property("extractProgram").toString(), + m_cliProps->extractArgs(absoluteDestinationPath, fileList, false, password)); + pProcess->start(); + pProcess->waitForFinished(-1); + + bPasswordEntered = true; + break; + } + } + if (bPasswordEntered) + break; + } + } + } else { + pProcess->waitForFinished(-1); + } } } pProcess->deleteLater(); From 94ee22d8b8319987a8359155a08492e0e588c5f1 Mon Sep 17 00:00:00 2001 From: ZhangTingan Date: Tue, 19 May 2026 15:30:40 +0800 Subject: [PATCH 2/2] fix: handle wrong password when processing longname-extract Log: as title bug: https://pms.uniontech.com//bug-view-361845.html --- .../archiveinterface/cliinterface.cpp | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/3rdparty/interface/archiveinterface/cliinterface.cpp b/3rdparty/interface/archiveinterface/cliinterface.cpp index d6d158f9..e6fdaf84 100644 --- a/3rdparty/interface/archiveinterface/cliinterface.cpp +++ b/3rdparty/interface/archiveinterface/cliinterface.cpp @@ -227,7 +227,10 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const } if (bHandleLongName) { if (!handleLongNameExtract(m_files)) { - m_eErrorType = ET_FileWriteError; + if (m_eErrorType == ET_NoError) { + m_eErrorType = ET_FileWriteError; + } + emit signalFinished(PFT_Error); return PFT_Error; } } @@ -269,7 +272,10 @@ PluginFinishType CliInterface::extractFiles(const QList &files, const if (bHandleLongName) { if (!handleLongNameExtract(arcData.mapFileEntry.values())) { - m_eErrorType = ET_FileWriteError; + if (m_eErrorType == ET_NoError) { + m_eErrorType = ET_FileWriteError; + } + emit signalFinished(PFT_Error); return PFT_Error; } } @@ -779,9 +785,14 @@ bool CliInterface::runProcess(const QString &programName, const QStringList &arg if (exitCode != 0) { emit signalprogress(100); emit signalFinished(PFT_Error); + return; } deleteProcess(); - extractFiles(m_files, m_extractOptions, property("lnfs").toBool()); + PluginFinishType ret = extractFiles(m_files, m_extractOptions, property("lnfs").toBool()); + if (ret == PFT_Error) { + emit signalprogress(100); + emit signalFinished(PFT_Error); + } } }); } @@ -1321,6 +1332,14 @@ bool CliInterface::handleLongNameExtract(const QList &files) pProcess->start(); pProcess->waitForFinished(-1); + if (pProcess->exitCode() != 0) { + QByteArray output = pProcess->readAllStandardOutput(); + if (output.contains("Wrong password")) { + m_eErrorType = ET_WrongPassword; + return false; + } + } + bPasswordEntered = true; break; }