]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Zip importing: Handle spaces in filenames correctly
authorRoopesh Chander <roop@roopc.net>
Wed, 12 Dec 2018 10:31:24 +0000 (16:01 +0530)
committerRoopesh Chander <roop@roopc.net>
Wed, 12 Dec 2018 11:27:17 +0000 (16:57 +0530)
Previously, if a filename of a .conf file inside the zip file
contained spaces, it was not imported.

Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/ZipArchive/ZipArchive.swift
WireGuard/WireGuard/ZipArchive/ZipImporter.swift

index a849daa38a51d8c77a93c95a1ff3469cfe084a47..900341ec1c0e506b00a95adc4b3b7be8d1686c8c 100644 (file)
@@ -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 {
index d281fb689c653a91b36f9451b179b8c467fa7c72..6c1e3de2eceeeac28d02e13377cb9197a085d4b7 100644 (file)
@@ -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<TunnelConfiguration?>(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