]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Zip: Add zip file reader
authorRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 19:34:46 +0000 (01:04 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 20:21:49 +0000 (01:51 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard.xcodeproj/project.pbxproj
WireGuard/WireGuard/ZipArchive/ZipArchive.swift [new file with mode: 0644]

index 61273058e1fb1ae81e67e40bebe95d803196325f..0c777d3a5a22d8f65b527a61164721d588672a72 100644 (file)
@@ -33,6 +33,7 @@
                6FDEF7FB21863B6100D8FBF6 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F621863B6100D8FBF6 /* unzip.c */; };
                6FDEF7FC21863B6100D8FBF6 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F721863B6100D8FBF6 /* zip.c */; };
                6FDEF80021863C0100D8FBF6 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7FF21863C0100D8FBF6 /* ioapi.c */; };
+               6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF801218646B900D8FBF6 /* ZipArchive.swift */; };
                6FF4AC1F211EC472002C96EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC1E211EC472002C96EB /* Assets.xcassets */; };
                6FF4AC22211EC472002C96EB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC20211EC472002C96EB /* LaunchScreen.storyboard */; };
                6FF4AC472120B9E0002C96EB /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4AC462120B9E0002C96EB /* NetworkExtension.framework */; };
                6FDEF7FA21863B6100D8FBF6 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
                6FDEF7FE21863C0100D8FBF6 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
                6FDEF7FF21863C0100D8FBF6 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
+               6FDEF801218646B900D8FBF6 /* ZipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipArchive.swift; sourceTree = "<group>"; };
                6FF4AC14211EC46F002C96EB /* WireGuard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WireGuard.app; sourceTree = BUILT_PRODUCTS_DIR; };
                6FF4AC1E211EC472002C96EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
                6FF4AC21211EC472002C96EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
                6FDEF7E72186320E00D8FBF6 /* ZipArchive */ = {
                        isa = PBXGroup;
                        children = (
+                               6FDEF801218646B900D8FBF6 /* ZipArchive.swift */,
                                6FDEF7F421863B6100D8FBF6 /* 3rdparty */,
                        );
                        path = ZipArchive;
                                6F628C41217F47DB003482A3 /* TunnelDetailTableViewController.swift in Sources */,
                                6F6899B02181B07B0012E523 /* FilePicker.swift in Sources */,
                                6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */,
+                               6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */,
                                6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                                        "$(inherited)",
                                        "@executable_path/Frameworks",
                                );
+                               "OTHER_CFLAGS[arch=*]" = "-DNOCRYPT";
                                PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
                                        "$(inherited)",
                                        "@executable_path/Frameworks",
                                );
+                               "OTHER_CFLAGS[arch=*]" = "-DNOCRYPT";
                                PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
diff --git a/WireGuard/WireGuard/ZipArchive/ZipArchive.swift b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift
new file mode 100644 (file)
index 0000000..ea6df17
--- /dev/null
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018 WireGuard LLC. All rights reserved.
+
+import Foundation
+
+enum ZipArchiveError: Error {
+    case cantOpenInputZipFile
+    case badArchive
+}
+
+class ZipArchive {
+
+    static func unarchive(url: URL, requiredFileExtensions: [String]) throws -> [(fileName: String, contents: Data)] {
+
+        var results: [(fileName: String, contents: Data)] = []
+
+        guard let zipFile = unzOpen64(url.path) else {
+            throw ZipArchiveError.cantOpenInputZipFile
+        }
+        defer {
+            unzClose(zipFile)
+        }
+        guard (unzGoToFirstFile(zipFile) == UNZ_OK) else {
+            throw ZipArchiveError.badArchive
+        }
+
+        var resultOfGoToNextFile: Int32
+        repeat {
+            guard (unzOpenCurrentFile(zipFile) == UNZ_OK) else {
+                throw ZipArchiveError.badArchive
+            }
+
+            let bufferSize = 1024
+            var fileNameBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: bufferSize)
+            var dataBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: bufferSize)
+
+            defer {
+                fileNameBuffer.deallocate()
+                dataBuffer.deallocate()
+            }
+
+            guard (unzGetCurrentFileInfo64(zipFile, nil, fileNameBuffer, UInt(bufferSize), nil, 0, nil, 0) == UNZ_OK) else {
+                throw ZipArchiveError.badArchive
+            }
+
+            let fileName = String(cString: fileNameBuffer)
+            let fileExtension = URL(string: fileName)?.pathExtension ?? ""
+
+            if (requiredFileExtensions.contains(fileExtension)) {
+                var unzippedData = Data()
+                var bytesRead: Int32 = 0
+                repeat {
+                    bytesRead = unzReadCurrentFile(zipFile, dataBuffer, UInt32(bufferSize))
+                    if (bytesRead > 0) {
+                        let dataRead = dataBuffer.withMemoryRebound(to: UInt8.self, capacity: bufferSize) {
+                            (buf: UnsafeMutablePointer<UInt8>) -> Data in
+                            return Data(bytes: buf, count: Int(bytesRead))
+                        }
+                        unzippedData.append(dataRead)
+                    }
+                } while (bytesRead > 0)
+                results.append((fileName: fileName, contents: unzippedData))
+            }
+
+            guard (unzCloseCurrentFile(zipFile) == UNZ_OK) else {
+                throw ZipArchiveError.badArchive
+            }
+
+            resultOfGoToNextFile = unzGoToNextFile(zipFile)
+        } while (resultOfGoToNextFile == UNZ_OK)
+
+        if (resultOfGoToNextFile == UNZ_END_OF_LIST_OF_FILE) {
+            return results
+        } else {
+            throw ZipArchiveError.badArchive
+        }
+    }
+}