diff --git a/Sources/NextcloudKit/Utils/FileNameValidator.swift b/Sources/NextcloudKit/Utils/FileNameValidator.swift index 12320712..d58e04e0 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.trimmingCharacters(in: .whitespaces).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) + } + } }