diff --git a/Sources/NextcloudKit/Utils/FileNameValidator.swift b/Sources/NextcloudKit/Utils/FileNameValidator.swift index 4479787..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,13 +42,13 @@ 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()}) } @@ -56,19 +57,19 @@ public class FileNameValidator { 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 forbidden 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: "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 } diff --git a/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift b/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift new file mode 100644 index 0000000..8e2299b --- /dev/null +++ b/Tests/NextcloudKitUnitTests/FileNameValidatorTests.swift @@ -0,0 +1,111 @@ +// +// fileNameValidatorTests.swift +// +// +// Created by Milen Pivchev on 12.07.24. +// Copyright © 2024 Milen Pivchev. All rights reserved. +// +// Author: Milen Pivchev +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +import XCTest +@testable import NextcloudKit + +class FileNameValidatorTests: XCTestCase { + let fileNameValidator = FileNameValidator.shared + + override func setUp() { + fileNameValidator.setup( + forbiddenFileNames: [".htaccess",".htaccess"], + forbiddenFileNameBasenames: ["con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", + "com5", "com6", "com7", "com8", "com9", "com¹", "com²", "com³", + "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", + "lpt8", "lpt9", "lpt¹", "lpt²", "lpt³"], + forbiddenFileNameCharacters: ["<", ">", ":", "\\\\", "/", "|", "?", "*", "&"], + forbiddenFileNameExtensions: [".filepart",".part"] + ) + super.setUp() + } + + func testInvalidCharacter() { + let result = fileNameValidator.checkFileName("file