From 8259145f85e136592efeac2cc8eaa6486c3f809e Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Wed, 12 Dec 2018 16:01:24 +0530 Subject: Zip importing: Handle spaces in filenames correctly Previously, if a filename of a .conf file inside the zip file contained spaces, it was not imported. Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/ZipArchive/ZipArchive.swift | 13 +++++++------ WireGuard/WireGuard/ZipArchive/ZipImporter.swift | 14 +++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) (limited to 'WireGuard') diff --git a/WireGuard/WireGuard/ZipArchive/ZipArchive.swift b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift index a849daa..900341e 100644 --- a/WireGuard/WireGuard/ZipArchive/ZipArchive.swift +++ b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift @@ -39,9 +39,9 @@ class ZipArchive { zipClose(zipFile, nil) } - static func unarchive(url: URL, requiredFileExtensions: [String]) throws -> [(fileName: String, contents: Data)] { + static func unarchive(url: URL, requiredFileExtensions: [String]) throws -> [(fileBaseName: String, contents: Data)] { - var results: [(fileName: String, contents: Data)] = [] + var results: [(fileBaseName: String, contents: Data)] = [] guard let zipFile = unzOpen64(url.path) else { throw ZipArchiveError.cantOpenInputZipFile @@ -72,10 +72,11 @@ class ZipArchive { throw ZipArchiveError.badArchive } - if let fileURL = URL(string: String(cString: fileNameBuffer)), - !fileURL.hasDirectoryPath, - requiredFileExtensions.contains(fileURL.pathExtension) { + let lastChar = String(cString: fileNameBuffer).suffix(1) + let isDirectory = (lastChar == "/" || lastChar == "\\") + let fileURL = URL(fileURLWithFileSystemRepresentation: fileNameBuffer, isDirectory: isDirectory, relativeTo: nil) + if (!isDirectory && requiredFileExtensions.contains(fileURL.pathExtension)) { var unzippedData = Data() var bytesRead: Int32 = 0 repeat { @@ -88,7 +89,7 @@ class ZipArchive { unzippedData.append(dataRead) } } while (bytesRead > 0) - results.append((fileName: fileURL.lastPathComponent, contents: unzippedData)) + results.append((fileBaseName: fileURL.deletingPathExtension().lastPathComponent, contents: unzippedData)) } guard (unzCloseCurrentFile(zipFile) == UNZ_OK) else { diff --git a/WireGuard/WireGuard/ZipArchive/ZipImporter.swift b/WireGuard/WireGuard/ZipArchive/ZipImporter.swift index d281fb6..6c1e3de 100644 --- a/WireGuard/WireGuard/ZipArchive/ZipImporter.swift +++ b/WireGuard/WireGuard/ZipArchive/ZipImporter.swift @@ -17,14 +17,14 @@ enum ZipImporterError: WireGuardAppError { class ZipImporter { static func importConfigFiles(from url: URL, completion: @escaping (WireGuardResult<[TunnelConfiguration?]>) -> Void) { DispatchQueue.global(qos: .userInitiated).async { - var unarchivedFiles: [(fileName: String, contents: Data)] + var unarchivedFiles: [(fileBaseName: String, contents: Data)] do { unarchivedFiles = try ZipArchive.unarchive(url: url, requiredFileExtensions: ["conf"]) - for (i, unarchivedFile) in unarchivedFiles.enumerated().reversed() { - let fileBaseName = URL(string: unarchivedFile.fileName)?.deletingPathExtension().lastPathComponent - if let trimmedName = fileBaseName?.trimmingCharacters(in: .whitespacesAndNewlines), !trimmedName.isEmpty { - unarchivedFiles[i].fileName = trimmedName + let fileBaseName = unarchivedFile.fileBaseName + let trimmedName = fileBaseName.trimmingCharacters(in: .whitespacesAndNewlines) + if (!trimmedName.isEmpty) { + unarchivedFiles[i].fileBaseName = trimmedName } else { unarchivedFiles.remove(at: i) } @@ -40,7 +40,7 @@ class ZipImporter { fatalError() } - unarchivedFiles.sort { $0.fileName < $1.fileName } + unarchivedFiles.sort { $0.fileBaseName < $1.fileBaseName } var configs = Array(repeating: nil, count: unarchivedFiles.count) for (i, file) in unarchivedFiles.enumerated() { if (i > 0 && file == unarchivedFiles[i - 1]) { @@ -49,7 +49,7 @@ class ZipImporter { guard let fileContents = String(data: file.contents, encoding: .utf8) else { continue } - guard let tunnelConfig = try? WgQuickConfigFileParser.parse(fileContents, name: file.fileName) else { + guard let tunnelConfig = try? WgQuickConfigFileParser.parse(fileContents, name: file.fileBaseName) else { continue } configs[i] = tunnelConfig -- cgit v1.2.3-59-g8ed1b