diff --git a/Sources/NextcloudKit/Utils/FileNameValidator.swift b/Sources/NextcloudKit/Utils/FileNameValidator.swift index 70bfff9..ed4437c 100644 --- a/Sources/NextcloudKit/Utils/FileNameValidator.swift +++ b/Sources/NextcloudKit/Utils/FileNameValidator.swift @@ -28,12 +28,13 @@ public class FileNameValidator { return instance }() - public var forbiddenFileNames: [String] = [] { + public private(set) var forbiddenFileNames: [String] = [] { didSet { forbiddenFileNames = forbiddenFileNames.map({$0.uppercased()}) } } - public var forbiddenFileNameBasenames: [String] = [] { + + public private(set) var forbiddenFileNameBasenames: [String] = [] { didSet { forbiddenFileNameBasenames = forbiddenFileNameBasenames.map({$0.uppercased()}) } @@ -41,34 +42,34 @@ public class FileNameValidator { private var forbiddenFileNameCharactersRegex: NSRegularExpression? - public var forbiddenFileNameCharacters: [String] = [] { + public private(set) var forbiddenFileNameCharacters: [String] = [] { didSet { forbiddenFileNameCharactersRegex = try? NSRegularExpression(pattern: "[\(forbiddenFileNameCharacters.joined())]") } } - public var forbiddenFileNameExtensions: [String] = [] { + public private(set) var forbiddenFileNameExtensions: [String] = [] { didSet { forbiddenFileNameExtensions = forbiddenFileNameExtensions.map({$0.uppercased()}) } } - public let fileEndsWithSpacePeriodError = NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: NSLocalizedString("_file_name_validator_error_ends_with_space_period_", value: "File name ends with a space or a period", comment: "")) + public let fileEndsWithSpacePeriodError = NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: NSLocalizedString("_file_name_validator_error_ends_with_space_period_", value: "File name ends with a space or a period.", comment: "")) public var fileReservedNameError: NKError { - let errorMessageTemplate = NSLocalizedString("_file_name_validator_error_reserved_name_", value: "%@ is a reserved name", comment: "") + let errorMessageTemplate = NSLocalizedString("_file_name_validator_error_reserved_name_", value: "\"%@\" is a forbidden name.", comment: "") let errorMessage = String(format: errorMessageTemplate, templateString) return NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: errorMessage) } public var fileForbiddenFileExtensionError: NKError { - let errorMessageTemplate = NSLocalizedString("_file_name_validator_error_forbidden_file_extension_", value: ".%@ is a forbidden file extension", comment: "") + let errorMessageTemplate = NSLocalizedString("_file_name_validator_error_forbidden_file_extension_", value: ".\"%@\" is a forbidden file extension.", comment: "") let errorMessage = String(format: errorMessageTemplate, templateString) return NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: errorMessage) } public var fileInvalidCharacterError: NKError { - let errorMessageTemplate = NSLocalizedString("file_name_validator_error_invalid_character_", value: "File name contains an invalid character: %@", comment: "") + let errorMessageTemplate = NSLocalizedString("_file_name_validator_error_invalid_character_", value: "Name contains an invalid character: \"%@\".", comment: "") let errorMessage = String(format: errorMessageTemplate, templateString) return NKError(errorCode: NSURLErrorCannotCreateFile, errorDescription: errorMessage) } @@ -84,7 +85,7 @@ public class FileNameValidator { self.forbiddenFileNameExtensions = forbiddenFileNameExtensions } - public func checkFileName(_ filename: String, existedFileNames: Set? = nil) -> NKError? { + public func checkFileName(_ filename: String) -> NKError? { if filename.hasSuffix(" ") || filename.hasSuffix(".") { return fileEndsWithSpacePeriodError } @@ -107,6 +108,11 @@ public class FileNameValidator { return nil } + public func checkFolderPath(folderPath: String) -> Bool { + return folderPath.split { $0 == "/" || $0 == "\\" } + .allSatisfy { checkFileName(String($0)) == nil } + } + private func checkInvalidCharacters(string: String) -> NKError? { for char in string { let charAsString = String(char) diff --git a/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift b/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift index f49b2cb..8e2299b 100644 --- a/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift +++ b/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift @@ -1,7 +1,7 @@ // // fileNameValidatorTests.swift -// -// +// +// // Created by Milen Pivchev on 12.07.24. // Copyright © 2024 Milen Pivchev. All rights reserved. // @@ -66,4 +66,46 @@ class FileNameValidatorTests: XCTestCase { let result = fileNameValidator.checkFileName("validFileName") XCTAssertNil(result?.errorDescription) } + + func testValidFolderAndFilePaths() { + let folderPath = "validFolder" + + let result = fileNameValidator.checkFolderPath(folderPath: folderPath) + XCTAssertTrue(result) + } + + func testFolderPathWithReservedName() { + let folderPath = "CON" + + let result = fileNameValidator.checkFolderPath(folderPath: folderPath) + XCTAssertFalse(result) + } + + func testFolderPathWithInvalidCharacter() { + let folderPath = "invalid