diff options
author | Andrej Mihajlov <and@mullvad.net> | 2020-12-02 12:27:39 +0100 |
---|---|---|
committer | Andrej Mihajlov <and@mullvad.net> | 2020-12-03 13:32:24 +0100 |
commit | ec574085703ea1c8b2d4538596961beb910c4382 (patch) | |
tree | 73cf8bbdb74fe5575606664bccd0232ffa911803 /Sources/WireGuardApp/ZipArchive/ZipImporter.swift | |
parent | WireGuardKit: Assert that resolutionResults must not contain failures (diff) | |
download | wireguard-apple-ec574085703ea1c8b2d4538596961beb910c4382.tar.xz wireguard-apple-ec574085703ea1c8b2d4538596961beb910c4382.zip |
Move all source files to `Sources/` and rename WireGuardKit targets
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
Diffstat (limited to 'Sources/WireGuardApp/ZipArchive/ZipImporter.swift')
-rw-r--r-- | Sources/WireGuardApp/ZipArchive/ZipImporter.swift | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/Sources/WireGuardApp/ZipArchive/ZipImporter.swift b/Sources/WireGuardApp/ZipArchive/ZipImporter.swift new file mode 100644 index 0000000..c988e94 --- /dev/null +++ b/Sources/WireGuardApp/ZipArchive/ZipImporter.swift @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. + +import Foundation +import WireGuardKit + +class ZipImporter { + static func importConfigFiles(from url: URL, completion: @escaping (Result<[TunnelConfiguration?], ZipArchiveError>) -> Void) { + DispatchQueue.global(qos: .userInitiated).async { + var unarchivedFiles: [(fileBaseName: String, contents: Data)] + do { + unarchivedFiles = try ZipArchive.unarchive(url: url, requiredFileExtensions: ["conf"]) + for (index, unarchivedFile) in unarchivedFiles.enumerated().reversed() { + let fileBaseName = unarchivedFile.fileBaseName + let trimmedName = fileBaseName.trimmingCharacters(in: .whitespacesAndNewlines) + if !trimmedName.isEmpty { + unarchivedFiles[index].fileBaseName = trimmedName + } else { + unarchivedFiles.remove(at: index) + } + } + + if unarchivedFiles.isEmpty { + throw ZipArchiveError.noTunnelsInZipArchive + } + } catch let error as ZipArchiveError { + DispatchQueue.main.async { completion(.failure(error)) } + return + } catch { + fatalError() + } + + unarchivedFiles.sort { TunnelsManager.tunnelNameIsLessThan($0.fileBaseName, $1.fileBaseName) } + var configs: [TunnelConfiguration?] = Array(repeating: nil, count: unarchivedFiles.count) + for (index, file) in unarchivedFiles.enumerated() { + if index > 0 && file == unarchivedFiles[index - 1] { + continue + } + guard let fileContents = String(data: file.contents, encoding: .utf8) else { continue } + guard let tunnelConfig = try? TunnelConfiguration(fromWgQuickConfig: fileContents, called: file.fileBaseName) else { continue } + configs[index] = tunnelConfig + } + DispatchQueue.main.async { completion(.success(configs)) } + } + } +} |