From bc32befa8c1530e13bd75770e1cfc609568d8605 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Wed, 21 Aug 2024 15:48:47 +0200 Subject: [PATCH 1/3] ensure the arguments of socket API commands are valid fix string data being invalid when using QStringView Signed-off-by: Matthieu Gallien --- src/gui/socketapi/socketapi.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index 9478ca353c85f..9edd220bc2f36 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -387,9 +387,9 @@ void SocketApi::slotReadSocket() return out; }(); - const auto argument = argPos != -1 ? line.midRef(argPos + 1) : QStringRef(); + const auto argument = QString{argPos != -1 ? line.mid(argPos + 1) : QString()}; if (command.startsWith("ASYNC_")) { - auto arguments = argument.split('|'); + const auto arguments = argument.split('|'); if (arguments.size() != 2) { listener->sendError(QStringLiteral("argument count is wrong")); return; @@ -400,7 +400,7 @@ void SocketApi::slotReadSocket() auto jobId = arguments[0]; auto socketApiJob = QSharedPointer( - new SocketApiJob(jobId.toString(), listener, json), &QObject::deleteLater); + new SocketApiJob(jobId, listener, json), &QObject::deleteLater); if (indexOfMethod != -1) { staticMetaObject.method(indexOfMethod) .invoke(this, Qt::QueuedConnection, @@ -414,7 +414,7 @@ void SocketApi::slotReadSocket() QJsonParseError error{}; const auto json = QJsonDocument::fromJson(argument.toUtf8(), &error).object(); if (error.error != QJsonParseError::NoError) { - qCWarning(lcSocketApi()) << "Invalid json" << argument.toString() << error.errorString(); + qCWarning(lcSocketApi()) << "Invalid json" << argument << error.errorString(); listener->sendError(error.errorString()); return; } @@ -432,7 +432,7 @@ void SocketApi::slotReadSocket() if (indexOfMethod != -1) { ASSERT(thread() == QThread::currentThread()) staticMetaObject.method(indexOfMethod) - .invoke(this, Qt::QueuedConnection, Q_ARG(QString, argument.toString()), + .invoke(this, Qt::QueuedConnection, Q_ARG(QString, argument), Q_ARG(SocketListener *, listener.data())); } } else { @@ -440,7 +440,7 @@ void SocketApi::slotReadSocket() // to ensure that listener is still valid we need to call it with Qt::DirectConnection ASSERT(thread() == QThread::currentThread()) staticMetaObject.method(indexOfMethod) - .invoke(this, Qt::DirectConnection, Q_ARG(QString, argument.toString()), + .invoke(this, Qt::DirectConnection, Q_ARG(QString, argument), Q_ARG(SocketListener *, listener.data())); } } From 9fd27567d46e801c15bd3d508e1eccea182da199 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Wed, 21 Aug 2024 15:50:04 +0200 Subject: [PATCH 2/3] only add encrypt menu entry for top folders with current end-to-end encryption only top folders can be encrypted limit the availability of the menu entry to top folders Signed-off-by: Matthieu Gallien --- src/gui/socketapi/socketapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index 9edd220bc2f36..5f3358ea7c881 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -1241,7 +1241,7 @@ void SocketApi::sendEncryptFolderCommandMenuEntries(const QFileInfo &fileInfo, ancestor = ancestor.parentFolder(); } - if (!anyAncestorEncrypted) { + if (!anyAncestorEncrypted && !fileData.parentFolder().journalRecord().isValid()) { const auto isOnTheServer = fileData.journalRecord().isValid(); const auto flagString = isOnTheServer ? QLatin1String("::") : QLatin1String(":d:"); listener->sendMessage(QStringLiteral("MENU_ITEM:ENCRYPT") + flagString + tr("Encrypt")); From b79794b75497a1856fee4332449db3d59203b541 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Wed, 21 Aug 2024 17:41:35 +0200 Subject: [PATCH 3/3] only empty top folders offer the menu entry to encrypt in the contextual menu shown in files explorer will show encrypt menu entry only for top folders that are non-encrypted and empty Signed-off-by: Matthieu Gallien --- src/gui/socketapi/socketapi.cpp | 12 +++++++++++- src/gui/socketapi/socketapi.h | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index 5f3358ea7c881..effac32dfd8af 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -1226,7 +1226,8 @@ void SocketApi::sendEncryptFolderCommandMenuEntries(const QFileInfo &fileInfo, !fileData.folder->accountState()->account() || !fileData.folder->accountState()->account()->capabilities().clientSideEncryptionAvailable() || !fileInfo.isDir() || - isE2eEncryptedPath) { + isE2eEncryptedPath || + !fileData.isFolderEmpty(fileInfo)) { return; } @@ -1312,6 +1313,15 @@ QString SocketApi::FileData::folderRelativePathNoVfsSuffix() const return result; } +bool SocketApi::FileData::isFolderEmpty(const QFileInfo &fileInfo) const +{ + if (fileInfo.isDir()) { + const auto nativeFolder = QDir{localPath}; + return nativeFolder.isEmpty(); + } + return false; +} + SyncFileStatus SocketApi::FileData::syncFileStatus() const { if (!folder) diff --git a/src/gui/socketapi/socketapi.h b/src/gui/socketapi/socketapi.h index 8662fde9b70a9..e97d9750708cb 100644 --- a/src/gui/socketapi/socketapi.h +++ b/src/gui/socketapi/socketapi.h @@ -99,6 +99,8 @@ private slots: // Relative path of the file locally, without any vfs suffix [[nodiscard]] QString folderRelativePathNoVfsSuffix() const; + [[nodiscard]] bool isFolderEmpty(const QFileInfo &fileInfo) const; + Folder *folder = nullptr; // Absolute path of the file locally. (May be a virtual file) QString localPath;