summaryrefslogtreecommitdiff
blob: 08d72d754d7075548cfc5360710103a18b173452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
From e79da836c34fce66231e396c7215314d0eba51b4 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] MimeTypeFinderJob: Resolve symlinks for a local file

---
 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 72296b9b8..f494ff3b6 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 f5e50cdc4..48fc8c289 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"));
     }
-- 
GitLab