From b287467137f8f6438e853e3ed7ad7d459f8a7e61 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sun, 23 Oct 2022 18:05:15 +0300 Subject: [PATCH] kdecore: do not prepend the temporary directory and main component name if template is absolute path from KTemporaryFile::filePath() Signed-off-by: Ivailo Monev --- kdecore/io/ktemporaryfile.cpp | 8 ++-- kdecore/io/ktemporaryfile.h | 4 +- kdecore/tests/ktempdirtest.cpp | 56 ++++++++++++++-------------- kdecore/tests/ktempdirtest.h | 9 +++-- kdecore/tests/ktemporaryfiletest.cpp | 12 ++++++ kdecore/tests/ktemporaryfiletest.h | 3 +- 6 files changed, 54 insertions(+), 38 deletions(-) diff --git a/kdecore/io/ktemporaryfile.cpp b/kdecore/io/ktemporaryfile.cpp index 55b999f1..485e1742 100644 --- a/kdecore/io/ktemporaryfile.cpp +++ b/kdecore/io/ktemporaryfile.cpp @@ -100,8 +100,10 @@ QString KTemporaryFile::filePath(const QString &pathtemplate) result.replace(xindex, 1, QChar::fromLatin1(tmpnamechars[KRandom::randomMax(52)])); xindex = result.indexOf(xchar, xindex + 1); } - result.prepend(underscorechar); - result.prepend(KGlobal::mainComponent().componentName()); - result.prepend(KGlobal::dirs()->saveLocation("tmp")); + if (!QDir::isAbsolutePath(result)) { + result.prepend(underscorechar); + result.prepend(KGlobal::mainComponent().componentName()); + result.prepend(KGlobal::dirs()->saveLocation("tmp")); + } return result; } diff --git a/kdecore/io/ktemporaryfile.h b/kdecore/io/ktemporaryfile.h index 5b973011..e50ec9bc 100644 --- a/kdecore/io/ktemporaryfile.h +++ b/kdecore/io/ktemporaryfile.h @@ -138,8 +138,8 @@ public: * If @p pathtemplate is empty the result will have 10 characters, the * standard temporary directory prepended along with the main component * name. Otherwise any 'X' in @p pathtemplate is replaced with random - * character, the standard temporary directory prepended along with the - * main component name. + * character. The standard temporary directory prepended along with the + * main component name unless @p pathtemplate is absolute path. * * @param pathtemplate The template to use when generating filepath. */ diff --git a/kdecore/tests/ktempdirtest.cpp b/kdecore/tests/ktempdirtest.cpp index 7ea6392b..c68a4c0d 100644 --- a/kdecore/tests/ktempdirtest.cpp +++ b/kdecore/tests/ktempdirtest.cpp @@ -27,48 +27,48 @@ void KTempDirTest::testNoDelete() { - KTempDir dir("test"); - dir.setAutoRemove(false); - QVERIFY(dir.status() == 0); - QVERIFY(dir.exists()); - QVERIFY(QDir(dir.name()).exists()); + KTempDir dir("test"); + dir.setAutoRemove(false); + QVERIFY(dir.status() == 0); + QVERIFY(dir.exists()); + QVERIFY(QDir(dir.name()).exists()); - dir.unlink(); - QVERIFY(dir.status() == 0); - QVERIFY(!dir.exists()); - QVERIFY(!QDir(dir.name()).exists()); + dir.unlink(); + QVERIFY(dir.status() == 0); + QVERIFY(!dir.exists()); + QVERIFY(!QDir(dir.name()).exists()); } void KTempDirTest::testAutoDelete() { - KTempDir *dir = new KTempDir("test"); - QVERIFY(dir->status() == 0); - QVERIFY(dir->exists()); + KTempDir *dir = new KTempDir("test"); + QVERIFY(dir->status() == 0); + QVERIFY(dir->exists()); - QString dName = dir->name(); - delete dir; - QVERIFY(!QDir(dName).exists()); + QString dName = dir->name(); + delete dir; + QVERIFY(!QDir(dName).exists()); } void KTempDirTest::testCreateSubDir() { - KTempDir *dir = new KTempDir("test"); - QVERIFY(dir->status() == 0); - QVERIFY(dir->exists()); + KTempDir *dir = new KTempDir("test"); + QVERIFY(dir->status() == 0); + QVERIFY(dir->exists()); - QDir d ( dir->name() ); - QVERIFY(d.exists()); + QDir d ( dir->name() ); + QVERIFY(d.exists()); - QVERIFY(d.mkdir(QString("123"))); - QVERIFY(d.mkdir(QString("456"))); + QVERIFY(d.mkdir(QString("123"))); + QVERIFY(d.mkdir(QString("456"))); - QString dName = dir->name(); - delete dir; - d.refresh(); + QString dName = dir->name(); + delete dir; + d.refresh(); - QVERIFY(!QDir(dName).exists()); - QVERIFY(!d.exists(QString("123"))); - QVERIFY(!d.exists(QString("456"))); + QVERIFY(!QDir(dName).exists()); + QVERIFY(!d.exists(QString("123"))); + QVERIFY(!d.exists(QString("456"))); } QTEST_KDEMAIN_CORE(KTempDirTest) diff --git a/kdecore/tests/ktempdirtest.h b/kdecore/tests/ktempdirtest.h index 297b719d..c2741dd4 100644 --- a/kdecore/tests/ktempdirtest.h +++ b/kdecore/tests/ktempdirtest.h @@ -25,9 +25,10 @@ class KTempDirTest : public QObject { Q_OBJECT private Q_SLOTS: - void testNoDelete(); - void testAutoDelete(); - void testCreateSubDir(); + void testNoDelete(); + void testAutoDelete(); + void testCreateSubDir(); + void testCreateSubDir(); }; -#endif +#endif // KTEMPDIRTEST_H diff --git a/kdecore/tests/ktemporaryfiletest.cpp b/kdecore/tests/ktemporaryfiletest.cpp index 38804505..be367f46 100644 --- a/kdecore/tests/ktemporaryfiletest.cpp +++ b/kdecore/tests/ktemporaryfiletest.cpp @@ -98,3 +98,15 @@ void KTemporaryFileTest::testKTemporaryFile() //directories we have write access to? } +void KTemporaryFileTest::testFilePath() +{ + const QString tmpdir = KGlobal::dirs()->saveLocation("tmp"); + + QString tmpfilepath = KTemporaryFile::filePath(); + QVERIFY(tmpfilepath.startsWith(tmpdir)); + QVERIFY(!tmpfilepath.contains('X')); + + tmpfilepath = KTemporaryFile::filePath("/foo/bar/XXXXX.tmp"); + QVERIFY(tmpfilepath.startsWith(QLatin1String("/foo/bar/"))); + QVERIFY(!tmpfilepath.contains('X')); +} diff --git a/kdecore/tests/ktemporaryfiletest.h b/kdecore/tests/ktemporaryfiletest.h index 3e3aa722..b6a1d65b 100644 --- a/kdecore/tests/ktemporaryfiletest.h +++ b/kdecore/tests/ktemporaryfiletest.h @@ -17,10 +17,11 @@ private slots: void initTestCase(); void cleanupTestCase(); void testKTemporaryFile(); + void testFilePath(); private: QString kdeTempDir; QString componentName; }; -#endif +#endif // KTEMPORARYFILETEST_H