summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJonas Kvinge <jonas@jkvinge.net>2022-12-27 03:57:06 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2023-01-21 17:11:19 +0100
commit1d9060f0d9b3a36b343307ebe88b125a5d2b0e94 (patch)
treeea5b507f8a637171a9f0b4f7f841180d1ee405a5 /src
parentd4078e9c67d973360026437ad6a8fabc250b7a5e (diff)
QFileSystemEngine: URL encode path in trash info, use relative path
According to the specifications, the path in .trashinfo should be URL encoded. The path can be relative when possible, otherwise changing the mountpoint will break restoring files from trash. But don't do that for root (/) and home. For more info, see.: https://specifications.freedesktop.org/trash-spec/trashspec-1.0.html Change-Id: Id8271a893a007f4cb5c10611f2b1bc71c1ff4860 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 314a4d121f55a7a6cd8335c9953d105574efab76) Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 4bebfa17b9..90735a8615 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -44,6 +44,7 @@
#include "qfile.h"
#include "qstorageinfo.h"
#include "qtextstream.h"
+#include "qurl.h"
#include <QtCore/qoperatingsystemversion.h>
#include <QtCore/private/qcore_unix_p.h>
@@ -1392,6 +1393,16 @@ bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
const QString targetPath = trashDir.filePath(filesDir) + uniqueTrashedName;
const QFileSystemEntry target(targetPath);
+ QString infoPath;
+ const QStorageInfo storageInfo(sourcePath);
+ if (storageInfo.isValid() && storageInfo.rootPath() != rootPath() && storageInfo != QStorageInfo(QDir::home())) {
+ infoPath = sourcePath.mid(storageInfo.rootPath().length());
+ if (infoPath.front() == u'/')
+ infoPath = infoPath.mid(1);
+ } else {
+ infoPath = sourcePath;
+ }
+
/*
We might fail to rename if source and target are on different file systems.
In that case, we don't try further, i.e. copying and removing the original
@@ -1408,7 +1419,7 @@ bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
out.setCodec("UTF-8");
#endif
out << "[Trash Info]" << Qt::endl;
- out << "Path=" << sourcePath << Qt::endl;
+ out << "Path=" << QUrl::toPercentEncoding(infoPath, "/") << Qt::endl;
out << "DeletionDate="
<< QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-ddThh:mm:ss")) << Qt::endl;
infoFile.close();