From 1d53f3b4849beb1c63aa38e611fe8117ed12f38b Mon Sep 17 00:00:00 2001 From: Milen Pivchev Date: Thu, 21 Aug 2025 15:36:04 +0200 Subject: [PATCH 1/2] Fix empty file name not checked Signed-off-by: Milen Pivchev --- Sources/NextcloudKit/Utils/FileNameValidator.swift | 8 ++++++++ .../FileNameValidatorUnitTests.swift | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Sources/NextcloudKit/Utils/FileNameValidator.swift b/Sources/NextcloudKit/Utils/FileNameValidator.swift index 12320712..2fe37e57 100644 --- a/Sources/NextcloudKit/Utils/FileNameValidator.swift +++ b/Sources/NextcloudKit/Utils/FileNameValidator.swift @@ -10,6 +10,10 @@ public final class FileNameValidator: Sendable { private let forbiddenFileNameCharacters: [String] private let forbiddenFileNameExtensions: [String] + public func fileEmptyNameError() -> NKError { + NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: NSLocalizedString("_file_name_empty_", value: "File name cannot be empty.", comment: "")) + } + public func fileWithSpaceError() -> NKError { NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: NSLocalizedString("_file_name_validator_error_space_", value: "Name must not contain spaces at the beginning or end.", comment: "")) } @@ -40,6 +44,10 @@ public final class FileNameValidator: Sendable { } public func checkFileName(_ filename: String) -> NKError? { + if filename.isEmpty { + return fileEmptyNameError() + } + if let regex = try? NSRegularExpression(pattern: "[\(forbiddenFileNameCharacters.joined())]"), let invalidCharacterError = checkInvalidCharacters(string: filename, regex: regex) { return invalidCharacterError } diff --git a/Tests/NextcloudKitUnitTests/FileNameValidatorUnitTests.swift b/Tests/NextcloudKitUnitTests/FileNameValidatorUnitTests.swift index 287bc306..b7565d70 100644 --- a/Tests/NextcloudKitUnitTests/FileNameValidatorUnitTests.swift +++ b/Tests/NextcloudKitUnitTests/FileNameValidatorUnitTests.swift @@ -130,4 +130,18 @@ class FileNameValidatorUnitTests: XCTestCase { let result = fileNameValidator.checkFolderPath(folderPath) XCTAssertFalse(result) } + + func testFileNameEmpty() { + let folderPath = "/A1/Aaaww/W/ " + let filePaths = ["", " ", " ", " "] + + let result = fileNameValidator.checkFolderPath(folderPath) + XCTAssertFalse(result) + + filePaths.forEach { path in + let result = fileNameValidator.checkFileName(path) + + XCTAssertNotNil(result?.errorDescription) + } + } } From b173a107e826a2a682e06e0dcd41f65a95cb625c Mon Sep 17 00:00:00 2001 From: Milen Pivchev Date: Thu, 21 Aug 2025 15:46:10 +0200 Subject: [PATCH 2/2] trim whitespace Signed-off-by: Milen Pivchev --- Sources/NextcloudKit/Utils/FileNameValidator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/NextcloudKit/Utils/FileNameValidator.swift b/Sources/NextcloudKit/Utils/FileNameValidator.swift index 2fe37e57..d58e04e0 100644 --- a/Sources/NextcloudKit/Utils/FileNameValidator.swift +++ b/Sources/NextcloudKit/Utils/FileNameValidator.swift @@ -44,7 +44,7 @@ public final class FileNameValidator: Sendable { } public func checkFileName(_ filename: String) -> NKError? { - if filename.isEmpty { + if filename.trimmingCharacters(in: .whitespaces).isEmpty { return fileEmptyNameError() }