From 203d6b459610de0111eb57280f92f4d29eee32ab Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Wed, 14 Nov 2018 18:52:10 +0530 Subject: Importing: Refactor out zip importing into a separate class Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/ZipArchive/ZipImporter.swift | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 WireGuard/WireGuard/ZipArchive/ZipImporter.swift (limited to 'WireGuard/WireGuard/ZipArchive/ZipImporter.swift') diff --git a/WireGuard/WireGuard/ZipArchive/ZipImporter.swift b/WireGuard/WireGuard/ZipArchive/ZipImporter.swift new file mode 100644 index 0000000..7ee5c32 --- /dev/null +++ b/WireGuard/WireGuard/ZipArchive/ZipImporter.swift @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +import UIKit + +enum ZipImporterError: Error { + case noTunnelsInZipArchive +} + +class ZipImporter { + let url: URL + init(url: URL) { + self.url = url + } + + func importConfigFiles() throws -> [TunnelConfiguration?] { + var unarchivedFiles: [(fileName: String, contents: Data)] = 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 + } else { + unarchivedFiles.remove(at: i) + } + } + + if (unarchivedFiles.isEmpty) { + throw ZipImporterError.noTunnelsInZipArchive + } + + unarchivedFiles.sort { $0.fileName < $1.fileName } + var configs = Array(repeating: nil, count: unarchivedFiles.count) + for (i, file) in unarchivedFiles.enumerated() { + if (i > 0 && file == unarchivedFiles[i - 1]) { + continue + } + guard let fileContents = String(data: file.contents, encoding: .utf8) else { + continue + } + guard let tunnelConfig = try? WgQuickConfigFileParser.parse(fileContents, name: file.fileName) else { + continue + } + configs[i] = tunnelConfig + } + return configs + } +} -- cgit v1.2.3-59-g8ed1b