diff --git a/WireGuard/WireGuard.xcodeproj/project.pbxproj b/WireGuard/WireGuard.xcodeproj/project.pbxproj index 6127305..0c777d3 100644 --- a/WireGuard/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard/WireGuard.xcodeproj/project.pbxproj @@ -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 */; }; @@ -103,6 +104,7 @@ 6FDEF7FA21863B6100D8FBF6 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = ""; }; 6FDEF7FE21863C0100D8FBF6 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = ""; }; 6FDEF7FF21863C0100D8FBF6 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = ""; }; + 6FDEF801218646B900D8FBF6 /* ZipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipArchive.swift; sourceTree = ""; }; 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 = ""; }; 6FF4AC21211EC472002C96EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -216,6 +218,7 @@ 6FDEF7E72186320E00D8FBF6 /* ZipArchive */ = { isa = PBXGroup; children = ( + 6FDEF801218646B900D8FBF6 /* ZipArchive.swift */, 6FDEF7F421863B6100D8FBF6 /* 3rdparty */, ); path = ZipArchive; @@ -449,6 +452,7 @@ 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; @@ -690,6 +694,7 @@ "$(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"; @@ -713,6 +718,7 @@ "$(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 index 0000000..ea6df17 --- /dev/null +++ b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift @@ -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.allocate(capacity: bufferSize) + var dataBuffer = UnsafeMutablePointer.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) -> 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 + } + } +}