Check for new forbidden filename-related capabilities during exclusion handling in...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 5 Aug 2024 09:50:46 +0000 (17:50 +0800)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Wed, 21 Aug 2024 07:51:39 +0000 (09:51 +0200)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/libsync/discovery.cpp

index 2b55eaf1c1d2f702367ddc2ae70c6d375fa4bbf5..f910a55ae33f4554afb215aa6b6e9078fd3cddf2 100644 (file)
@@ -292,8 +292,23 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
     }
 
     const auto &localName = entries.localEntry.name;
+    const auto splitName = localName.split('.');
+    const auto &baseName = splitName.first();
+    const auto extension = splitName.size() > 1 ? splitName.last() : QString();
+    const auto accountCaps = _discoveryData->_account->capabilities();
+    const auto forbiddenFilenames = accountCaps.forbiddenFilenames();
+    const auto forbiddenBasenames = accountCaps.forbiddenFilenameBasenames();
+    const auto forbiddenExtensions = accountCaps.forbiddenFilenameExtensions();
+    const auto forbiddenChars = accountCaps.forbiddenFilenameCharacters();
+
     if (excluded == CSYNC_NOT_EXCLUDED && !localName.isEmpty()
-            && _discoveryData->_serverBlacklistedFiles.contains(localName)) {
+        && (_discoveryData->_serverBlacklistedFiles.contains(localName)
+            || forbiddenFilenames.contains(localName)
+            || forbiddenBasenames.contains(baseName)
+            || forbiddenExtensions.contains(extension)
+            || std::any_of(forbiddenChars.cbegin(), forbiddenChars.cend(), [&localName](const QString &charPattern) {
+                   return localName.contains(charPattern);
+               }))) {
         excluded = CSYNC_FILE_EXCLUDE_SERVER_BLACKLISTED;
         isInvalidPattern = true;
     }