From 070f0bddda5647739c38da6196219b8b19a238e4 Mon Sep 17 00:00:00 2001 From: Toni Asensi Esteve Date: Wed, 26 Aug 2020 22:51:36 +0200 Subject: [PATCH] Solve large delays browsing big 7z archives FIXED: [ 425846 ] Too long delays are noticed when entering big 7z files BUG: 425846 Revision: https://invent.kde.org/utilities/krusader/-/merge_requests/28 --- krArc/krarc.cpp | 9 ++++++--- krusader/Archive/kr7zencryptionchecker.cpp | 6 ++++-- krusader/Archive/krarchandler.cpp | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/krArc/krarc.cpp b/krArc/krarc.cpp index bcbb0427..0ddbf893 100644 --- a/krArc/krarc.cpp +++ b/krArc/krarc.cpp @@ -1738,7 +1738,9 @@ void kio_krarcProtocol::checkIf7zIsEncrypted(bool &encrypted, QString fileName) lastData = encryptedArchPath = ""; KrLinecountingProcess proc; - proc << a7zExecutable << "-y" << "t" << fileName; + // Note: That command uses information given in a comment from + // https://stackoverflow.com/questions/5248572/how-do-i-know-if-7zip-used-aes256 + proc << a7zExecutable << "l" << "-slt" << fileName; connect(&proc, &KrLinecountingProcess::newOutputData, this, &kio_krarcProtocol::check7zOutputForPassword); proc.start(); proc.waitForFinished(); @@ -1763,13 +1765,14 @@ void kio_krarcProtocol::check7zOutputForPassword(KProcess * proc, QByteArray & b lastData = lines[ lines.count() - 1 ]; for (int i = 0; i != lines.count(); i++) { QString line = lines[ i ].trimmed().toLower(); - int ndx = line.indexOf("testing"); + int ndx = line.indexOf("listing"); // Reminder: Lower-case letters are used if (ndx >= 0) line.truncate(ndx); if (line.isEmpty()) continue; - if (line.contains("password") && line.contains("enter")) { + if ((line.contains("password") && line.contains("enter")) || + line == QStringLiteral("encrypted = +")) { KRDEBUG("Encrypted 7z archive found!"); encrypted = true; proc->kill(); diff --git a/krusader/Archive/kr7zencryptionchecker.cpp b/krusader/Archive/kr7zencryptionchecker.cpp index cfc8d193..6f530f74 100644 --- a/krusader/Archive/kr7zencryptionchecker.cpp +++ b/krusader/Archive/kr7zencryptionchecker.cpp @@ -47,15 +47,17 @@ void Kr7zEncryptionChecker::receivedOutput() lastData = lines[ lines.count() - 1 ]; for (int i = 0; i != lines.count(); i++) { QString line = lines[ i ].trimmed().toLower(); - int ndx = line.indexOf("testing"); + int ndx = line.indexOf("listing"); // Reminder: Lower-case letters are used if (ndx >= 0) line.truncate(ndx); if (line.isEmpty()) continue; - if (line.contains("password") && line.contains("enter")) { + if ((line.contains("password") && line.contains("enter")) || + line == QStringLiteral("encrypted = +")) { encrypted = true; ::kill(- pid(), SIGKILL); // kill the whole process group by giving the negative PID + break; } } } diff --git a/krusader/Archive/krarchandler.cpp b/krusader/Archive/krarchandler.cpp index c64a8e99..7834b435 100644 --- a/krusader/Archive/krarchandler.cpp +++ b/krusader/Archive/krarchandler.cpp @@ -708,8 +708,9 @@ void KrArcHandler::checkIf7zIsEncrypted(bool &encrypted, QString fileName) Kr7zEncryptionChecker proc; // TODO incorporate all this in Kr7zEncryptionChecker - proc << find7zExecutable() << "-y" << "t"; - proc << fileName; + // Note: That command uses information given in a comment from + // https://stackoverflow.com/questions/5248572/how-do-i-know-if-7zip-used-aes256 + proc << find7zExecutable() << "l" << "-slt" << fileName; proc.start(); proc.waitForFinished(); encrypted = proc.isEncrypted(); -- GitLab