Accepting request 893118 from home:Vogtinator:branches:KDE:Frameworks5
- Add patches to fix issues with MimeTypeFinderJob (kde#398908): * 0001-MimeTypeFinderJob-Resolve-symlinks-for-a-local-file.patch * 0002-MimeTypeFinderJob-the-StatJob-details-should-include.patch * 0003-kio_file-pass-the-absolute-path-to-QMimeDatabase-mim.patch OBS-URL: https://build.opensuse.org/request/show/893118 OBS-URL: https://build.opensuse.org/package/show/KDE:Frameworks5/kio?expand=0&rev=335
This commit is contained in:
parent
e570b53bb5
commit
ec2550ad7f
@ -0,0 +1,70 @@
|
|||||||
|
From 542a74b8fa70fa530a436ee3222a9b0562155708 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonathan Marten <jjm@keelhaul.me.uk>
|
||||||
|
Date: Sat, 8 May 2021 15:20:39 +0000
|
||||||
|
Subject: [PATCH 1/3] MimeTypeFinderJob: Resolve symlinks for a local file
|
||||||
|
|
||||||
|
(cherry picked from commit e79da836c34fce66231e396c7215314d0eba51b4)
|
||||||
|
---
|
||||||
|
autotests/mimetypefinderjobtest.cpp | 18 +++++++++++++++++-
|
||||||
|
src/core/mimetypefinderjob.cpp | 2 +-
|
||||||
|
2 files changed, 18 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/autotests/mimetypefinderjobtest.cpp b/autotests/mimetypefinderjobtest.cpp
|
||||||
|
index 72296b9b..f494ff3b 100644
|
||||||
|
--- a/autotests/mimetypefinderjobtest.cpp
|
||||||
|
+++ b/autotests/mimetypefinderjobtest.cpp
|
||||||
|
@@ -48,6 +48,7 @@ void MimeTypeFinderJobTest::determineMimeType_data()
|
||||||
|
QTest::newRow("text_file_no_extension") << "text/plain" << "srcfile";
|
||||||
|
QTest::newRow("desktop_file") << "application/x-desktop" << "foo.desktop";
|
||||||
|
QTest::newRow("script") << "application/x-shellscript" << "srcfile.sh";
|
||||||
|
+ QTest::newRow("directory") << "inode/directory" << "srcdir";
|
||||||
|
/* clang-format on */
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -60,7 +61,12 @@ void MimeTypeFinderJobTest::determineMimeType()
|
||||||
|
QTemporaryDir tempDir;
|
||||||
|
const QString srcDir = tempDir.path();
|
||||||
|
const QString srcFile = srcDir + QLatin1Char('/') + fileName;
|
||||||
|
- createSrcFile(srcFile);
|
||||||
|
+ if (mimeType == "inode/directory") {
|
||||||
|
+ QVERIFY(QDir(srcDir).mkdir(fileName));
|
||||||
|
+ } else {
|
||||||
|
+ createSrcFile(srcFile);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
QVERIFY(QFile::exists(srcFile));
|
||||||
|
const QUrl url = QUrl::fromLocalFile(srcFile);
|
||||||
|
|
||||||
|
@@ -68,6 +74,16 @@ void MimeTypeFinderJobTest::determineMimeType()
|
||||||
|
KIO::MimeTypeFinderJob *job = new KIO::MimeTypeFinderJob(url, this);
|
||||||
|
QVERIFY2(job->exec(), qPrintable(job->errorString()));
|
||||||
|
QCOMPARE(job->mimeType(), mimeType);
|
||||||
|
+
|
||||||
|
+ // Check that the result is the same when accessing the source
|
||||||
|
+ // file through a symbolic link (bug #436708)
|
||||||
|
+ const QString srcLink = srcDir + QLatin1String("/link_") + fileName;
|
||||||
|
+ QVERIFY(QFile::link(srcFile, srcLink));
|
||||||
|
+ const QUrl linkUrl = QUrl::fromLocalFile(srcLink);
|
||||||
|
+
|
||||||
|
+ job = new KIO::MimeTypeFinderJob(linkUrl, this);
|
||||||
|
+ QVERIFY2(job->exec(), qPrintable(job->errorString()));
|
||||||
|
+ QCOMPARE(job->mimeType(), mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MimeTypeFinderJobTest::invalidUrl()
|
||||||
|
diff --git a/src/core/mimetypefinderjob.cpp b/src/core/mimetypefinderjob.cpp
|
||||||
|
index f5e50cdc..48fc8c28 100644
|
||||||
|
--- a/src/core/mimetypefinderjob.cpp
|
||||||
|
+++ b/src/core/mimetypefinderjob.cpp
|
||||||
|
@@ -122,7 +122,7 @@ void KIO::MimeTypeFinderJobPrivate::statFile()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_mimeTypeName.isEmpty());
|
||||||
|
|
||||||
|
- KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, KIO::StatBasic, KIO::HideProgressInfo);
|
||||||
|
+ KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, KIO::StatBasic | KIO::StatResolveSymlink, KIO::HideProgressInfo);
|
||||||
|
if (!m_authPrompts) {
|
||||||
|
job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true"));
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
From e78b0cd47422869e980db633cbdc0c7cfcdd8dd8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ahmad Samir <a.samirh78@gmail.com>
|
||||||
|
Date: Thu, 13 May 2021 17:02:52 +0200
|
||||||
|
Subject: [PATCH 2/3] MimeTypeFinderJob: the StatJob details should include the
|
||||||
|
mimetype
|
||||||
|
|
||||||
|
Apparently we forgot to specify that we want the UDS_MIME_TYPE field in
|
||||||
|
the statFile() method (both when it lived in OpenUrlJob and when it was moved
|
||||||
|
to MimeTypeFinderJob). And now there is a dedicated StatJob flag, StatMimeType,
|
||||||
|
that we can use.
|
||||||
|
|
||||||
|
Not passing KIO::StatMimeType when creating the StatJob meant the code always
|
||||||
|
used a get job to determine the mime type, which mean that e.g. opening an
|
||||||
|
ISO file from Dolphin, which supposedly just needs to launch Ark, had the
|
||||||
|
whole file read into memory, which means that opening a couple of ISO's and
|
||||||
|
you're out of memory...
|
||||||
|
|
||||||
|
Thanks to sitter for doing a big chunk of the investigative work in the bug
|
||||||
|
report.
|
||||||
|
|
||||||
|
CCBUG: 398908
|
||||||
|
(cherry picked from commit c19876052ecec18a87a82f5950e8909e22e895ba)
|
||||||
|
---
|
||||||
|
src/core/mimetypefinderjob.cpp | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/core/mimetypefinderjob.cpp b/src/core/mimetypefinderjob.cpp
|
||||||
|
index 48fc8c28..baca5869 100644
|
||||||
|
--- a/src/core/mimetypefinderjob.cpp
|
||||||
|
+++ b/src/core/mimetypefinderjob.cpp
|
||||||
|
@@ -122,7 +122,9 @@ void KIO::MimeTypeFinderJobPrivate::statFile()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_mimeTypeName.isEmpty());
|
||||||
|
|
||||||
|
- KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, KIO::StatBasic | KIO::StatResolveSymlink, KIO::HideProgressInfo);
|
||||||
|
+ static constexpr auto statFlags = KIO::StatBasic | KIO::StatResolveSymlink | KIO::StatMimeType;
|
||||||
|
+
|
||||||
|
+ KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, statFlags, KIO::HideProgressInfo);
|
||||||
|
if (!m_authPrompts) {
|
||||||
|
job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true"));
|
||||||
|
}
|
||||||
|
@@ -147,6 +149,8 @@ void KIO::MimeTypeFinderJobPrivate::statFile()
|
||||||
|
|
||||||
|
const KIO::UDSEntry entry = job->statResult();
|
||||||
|
|
||||||
|
+ qCDebug(KIO_CORE) << "UDSEntry from StatJob in MimeTypeFinderJob" << entry;
|
||||||
|
+
|
||||||
|
const QString localPath = entry.stringValue(KIO::UDSEntry::UDS_LOCAL_PATH);
|
||||||
|
if (!localPath.isEmpty()) {
|
||||||
|
m_url = QUrl::fromLocalFile(localPath);
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
@ -0,0 +1,63 @@
|
|||||||
|
From dc5e968eefa4e6fafa0eecdfd36e7ea17b42fc08 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ahmad Samir <a.samirh78@gmail.com>
|
||||||
|
Date: Thu, 13 May 2021 23:03:57 +0200
|
||||||
|
Subject: [PATCH 3/3] kio_file: pass the absolute path to
|
||||||
|
QMimeDatabase::mimeTypeForFile()
|
||||||
|
|
||||||
|
Otherwise detecting the mime type based on the file content may fail and
|
||||||
|
return application/octet-stream.
|
||||||
|
|
||||||
|
And pass the whole url to createUDSEntry(), less QFile::decodeName/encodeName()
|
||||||
|
in the middle is better and less error prone.
|
||||||
|
|
||||||
|
Note that without this change a MimeTypeFinderJob could end up failing to
|
||||||
|
find the mime type of a local file based on the file contents.
|
||||||
|
|
||||||
|
(cherry picked from commit c748d6987252fafc296cde9351b289ef734cf861)
|
||||||
|
---
|
||||||
|
src/ioslaves/file/file_unix.cpp | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/ioslaves/file/file_unix.cpp b/src/ioslaves/file/file_unix.cpp
|
||||||
|
index 99d46c8f..940e3cbc 100644
|
||||||
|
--- a/src/ioslaves/file/file_unix.cpp
|
||||||
|
+++ b/src/ioslaves/file/file_unix.cpp
|
||||||
|
@@ -364,7 +364,7 @@ inline static time_t stat_mtime(QT_STATBUF &buf)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-static bool createUDSEntry(const QString &filename, const QByteArray &path, UDSEntry &entry, KIO::StatDetails details)
|
||||||
|
+static bool createUDSEntry(const QString &filename, const QByteArray &path, UDSEntry &entry, KIO::StatDetails details, const QUrl &url)
|
||||||
|
{
|
||||||
|
assert(entry.count() == 0); // by contract :-)
|
||||||
|
int entries = 0;
|
||||||
|
@@ -539,7 +539,7 @@ static bool createUDSEntry(const QString &filename, const QByteArray &path, UDSE
|
||||||
|
|
||||||
|
if (details & KIO::StatMimeType) {
|
||||||
|
QMimeDatabase db;
|
||||||
|
- entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, db.mimeTypeForFile(filename).name());
|
||||||
|
+ entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, db.mimeTypeForFile(url.toLocalFile()).name());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
@@ -1186,7 +1186,7 @@ void FileProtocol::listDir(const QUrl &url)
|
||||||
|
listEntry(entry);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
- if (createUDSEntry(filename, QByteArray(ep->d_name), entry, details)) {
|
||||||
|
+ if (createUDSEntry(filename, QByteArray(ep->d_name), entry, details, url)) {
|
||||||
|
#if HAVE_SYS_XATTR_H
|
||||||
|
if (isNtfsHidden(filename)) {
|
||||||
|
bool ntfsHidden = true;
|
||||||
|
@@ -1476,7 +1476,7 @@ void FileProtocol::stat(const QUrl &url)
|
||||||
|
const KIO::StatDetails details = getStatDetails();
|
||||||
|
|
||||||
|
UDSEntry entry;
|
||||||
|
- if (!createUDSEntry(url.fileName(), _path, entry, details)) {
|
||||||
|
+ if (!createUDSEntry(url.fileName(), _path, entry, details, url)) {
|
||||||
|
error(KIO::ERR_DOES_NOT_EXIST, path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri May 14 13:00:14 UTC 2021 - Fabian Vogt <fabian@ritter-vogt.de>
|
||||||
|
|
||||||
|
- Add patches to fix issues with MimeTypeFinderJob (kde#398908):
|
||||||
|
* 0001-MimeTypeFinderJob-Resolve-symlinks-for-a-local-file.patch
|
||||||
|
* 0002-MimeTypeFinderJob-the-StatJob-details-should-include.patch
|
||||||
|
* 0003-kio_file-pass-the-absolute-path-to-QMimeDatabase-mim.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu May 6 18:12:12 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
|
Thu May 6 18:12:12 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
|
||||||
|
|
||||||
|
4
kio.spec
4
kio.spec
@ -37,6 +37,10 @@ Source2: frameworks.keyring
|
|||||||
Source99: baselibs.conf
|
Source99: baselibs.conf
|
||||||
# PATCH-FIX-OPENSUSE kio_help-fallback-to-kde4-docs.patch -- allow kio_help to see into kde4 documentation, needed especially for khelpcenter5
|
# PATCH-FIX-OPENSUSE kio_help-fallback-to-kde4-docs.patch -- allow kio_help to see into kde4 documentation, needed especially for khelpcenter5
|
||||||
Patch0: kio_help-fallback-to-kde4-docs.patch
|
Patch0: kio_help-fallback-to-kde4-docs.patch
|
||||||
|
# PATCH-FIX-UPSTREAM
|
||||||
|
Patch1: 0001-MimeTypeFinderJob-Resolve-symlinks-for-a-local-file.patch
|
||||||
|
Patch2: 0002-MimeTypeFinderJob-the-StatJob-details-should-include.patch
|
||||||
|
Patch3: 0003-kio_file-pass-the-absolute-path-to-QMimeDatabase-mim.patch
|
||||||
BuildRequires: extra-cmake-modules >= %{_kf5_bugfix_version}
|
BuildRequires: extra-cmake-modules >= %{_kf5_bugfix_version}
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
BuildRequires: kf5-filesystem
|
BuildRequires: kf5-filesystem
|
||||||
|
Loading…
Reference in New Issue
Block a user