From f4deb1050f56148d2a3ac25fdeb65418d9665693 Mon Sep 17 00:00:00 2001 From: Ignat Loskutov Date: Wed, 28 Jun 2023 13:27:24 +0200 Subject: [PATCH] Disable symlink resolving in Torrent creator PR #19199. --- src/gui/torrentcreatordialog.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gui/torrentcreatordialog.cpp b/src/gui/torrentcreatordialog.cpp index 536a29cda..591786fc0 100644 --- a/src/gui/torrentcreatordialog.cpp +++ b/src/gui/torrentcreatordialog.cpp @@ -44,6 +44,18 @@ #define SETTINGS_KEY(name) u"TorrentCreator/" name +namespace +{ + // When the root file/directory of the created torrent is a symlink, we want to keep the symlink name in the torrent. + // On Windows, however, QFileDialog::DontResolveSymlinks disables shortcuts (.lnk files) expansion, making it impossible to pick a file if its path contains a shortcut. + // As of NTFS symlinks, they don't seem to be resolved anyways. +#ifndef Q_OS_WIN + const QFileDialog::Options FILE_DIALOG_OPTIONS {QFileDialog::DontResolveSymlinks}; +#else + const QFileDialog::Options FILE_DIALOG_OPTIONS {}; +#endif +} + TorrentCreatorDialog::TorrentCreatorDialog(QWidget *parent, const Path &defaultPath) : QDialog(parent) , m_ui(new Ui::TorrentCreatorDialog) @@ -106,14 +118,15 @@ void TorrentCreatorDialog::updateInputPath(const Path &path) void TorrentCreatorDialog::onAddFolderButtonClicked() { const QString oldPath = m_ui->textInputPath->text(); - const Path path {QFileDialog::getExistingDirectory(this, tr("Select folder"), oldPath)}; + const Path path {QFileDialog::getExistingDirectory(this, tr("Select folder") + , oldPath, (QFileDialog::ShowDirsOnly | FILE_DIALOG_OPTIONS))}; updateInputPath(path); } void TorrentCreatorDialog::onAddFileButtonClicked() { const QString oldPath = m_ui->textInputPath->text(); - const Path path {QFileDialog::getOpenFileName(this, tr("Select file"), oldPath)}; + const Path path {QFileDialog::getOpenFileName(this, tr("Select file"), oldPath, QString(), nullptr, FILE_DIALOG_OPTIONS)}; updateInputPath(path); } @@ -170,7 +183,12 @@ void TorrentCreatorDialog::dragEnterEvent(QDragEnterEvent *event) // Main function that create a .torrent file void TorrentCreatorDialog::onCreateButtonClicked() { +#ifdef Q_OS_WIN + // Resolve the path in case it contains a shortcut (otherwise, the following usages will consider it invalid) const auto inputPath = Utils::Fs::toCanonicalPath(Path(m_ui->textInputPath->text().trimmed())); +#else + const auto inputPath = Path(m_ui->textInputPath->text().trimmed()); +#endif // test if readable if (!Utils::Fs::isReadable(inputPath))