From c1065751b686f03ae991f3b6bf1a2f2011689143 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sun, 4 Nov 2018 11:37:00 +0100 Subject: [PATCH] Add method to parse configuration from [String] With an optional original URL. Helps testing. Take the chance to also disambiguate method overloads. --- Passepartout-iOS/Global/IssueReporter.swift | 2 +- Passepartout-iOS/Global/ParsedFile+Alerts.swift | 2 +- .../Scenes/ConfigurationViewController.swift | 2 +- .../Scenes/Organizer/WizardHostViewController.swift | 2 +- .../VPN/TunnelKitProvider+FileConfiguration.swift | 10 +++++++--- PassepartoutTests-iOS/FileConfigurationTests.swift | 4 ++-- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Passepartout-iOS/Global/IssueReporter.swift b/Passepartout-iOS/Global/IssueReporter.swift index ab9edf49..069081df 100644 --- a/Passepartout-iOS/Global/IssueReporter.swift +++ b/Passepartout-iOS/Global/IssueReporter.swift @@ -91,7 +91,7 @@ class IssueReporter: NSObject { } if let url = configurationURL { do { - let parsedFile = try TunnelKitProvider.Configuration.parsed(from: url, returnsStripped: true) + let parsedFile = try TunnelKitProvider.Configuration.parsed(fromURL: url, returnsStripped: true) if let attachment = parsedFile.strippedLines?.joined(separator: "\n").data(using: .utf8) { vc.addAttachmentData(attachment, mimeType: AppConstants.IssueReporter.MIME.configuration, fileName: AppConstants.IssueReporter.Filenames.configuration) } diff --git a/Passepartout-iOS/Global/ParsedFile+Alerts.swift b/Passepartout-iOS/Global/ParsedFile+Alerts.swift index 3a71e6fe..cc7ab6e0 100644 --- a/Passepartout-iOS/Global/ParsedFile+Alerts.swift +++ b/Passepartout-iOS/Global/ParsedFile+Alerts.swift @@ -35,7 +35,7 @@ extension ParsedFile { let file: ParsedFile log.debug("Parsing configuration URL: \(url)") do { - file = try TunnelKitProvider.Configuration.parsed(from: url) + file = try TunnelKitProvider.Configuration.parsed(fromURL: url) } catch let e { let message = localizedMessage(forError: e) alertImportError(url: url, in: viewController, withMessage: message) diff --git a/Passepartout-iOS/Scenes/ConfigurationViewController.swift b/Passepartout-iOS/Scenes/ConfigurationViewController.swift index 3da9973c..18633817 100644 --- a/Passepartout-iOS/Scenes/ConfigurationViewController.swift +++ b/Passepartout-iOS/Scenes/ConfigurationViewController.swift @@ -123,7 +123,7 @@ class ConfigurationViewController: UIViewController, TableModelHost { } let parsedFile: ParsedFile do { - parsedFile = try TunnelKitProvider.Configuration.parsed(from: originalURL) + parsedFile = try TunnelKitProvider.Configuration.parsed(fromURL: originalURL) } catch let e { log.error("Could not parse original configuration: \(e)") return diff --git a/Passepartout-iOS/Scenes/Organizer/WizardHostViewController.swift b/Passepartout-iOS/Scenes/Organizer/WizardHostViewController.swift index 7b64ec2f..b268eaa7 100644 --- a/Passepartout-iOS/Scenes/Organizer/WizardHostViewController.swift +++ b/Passepartout-iOS/Scenes/Organizer/WizardHostViewController.swift @@ -88,7 +88,7 @@ class WizardHostViewController: UITableViewController, TableModelHost { // MARK: Actions private func useSuggestedTitle() { - cellTitle?.field.text = parsedFile?.url.normalizedFilename + cellTitle?.field.text = parsedFile?.url?.normalizedFilename } @IBAction private func next() { diff --git a/Passepartout/Sources/VPN/TunnelKitProvider+FileConfiguration.swift b/Passepartout/Sources/VPN/TunnelKitProvider+FileConfiguration.swift index 664bf7fe..14f8aa86 100644 --- a/Passepartout/Sources/VPN/TunnelKitProvider+FileConfiguration.swift +++ b/Passepartout/Sources/VPN/TunnelKitProvider+FileConfiguration.swift @@ -30,7 +30,7 @@ import SwiftyBeaver private let log = SwiftyBeaver.self struct ParsedFile { - let url: URL + let url: URL? let hostname: String @@ -77,8 +77,12 @@ extension TunnelKitProvider.Configuration { static let externalFiles = Utils.regex("^(ca|cert|key|tls-auth|tls-crypt) ") } - static func parsed(from url: URL, returnsStripped: Bool = false) throws -> ParsedFile { + static func parsed(fromURL url: URL, returnsStripped: Bool = false) throws -> ParsedFile { let lines = try String(contentsOf: url).trimmedLines() + return try parsed(fromLines: lines, originalURL: url, returnsStripped: returnsStripped) + } + + static func parsed(fromLines lines: [String], originalURL: URL? = nil, returnsStripped: Bool = false) throws -> ParsedFile { var strippedLines: [String]? = returnsStripped ? [] : nil var warning: ApplicationError? = nil @@ -343,7 +347,7 @@ extension TunnelKitProvider.Configuration { builder.endpointProtocols = endpointProtocols return ParsedFile( - url: url, + url: originalURL, hostname: hostname, configuration: builder.build(), strippedLines: strippedLines, diff --git a/PassepartoutTests-iOS/FileConfigurationTests.swift b/PassepartoutTests-iOS/FileConfigurationTests.swift index fbfda800..9c6aa37d 100644 --- a/PassepartoutTests-iOS/FileConfigurationTests.swift +++ b/PassepartoutTests-iOS/FileConfigurationTests.swift @@ -39,7 +39,7 @@ class FileConfigurationTests: XCTestCase { } func testPIA() throws { - let file = try TunnelKitProvider.Configuration.parsed(from: url(withName: "pia-hungary")) + let file = try TunnelKitProvider.Configuration.parsed(fromURL: url(withName: "pia-hungary")) XCTAssertEqual(file.hostname, "hungary.privateinternetaccess.com") XCTAssertEqual(file.configuration.sessionConfiguration.cipher, .aes128cbc) XCTAssertEqual(file.configuration.sessionConfiguration.digest, .sha1) @@ -50,7 +50,7 @@ class FileConfigurationTests: XCTestCase { } func testStripped() throws { - let lines = try TunnelKitProvider.Configuration.parsed(from: url(withName: "pia-hungary"), returnsStripped: true).strippedLines! + let lines = try TunnelKitProvider.Configuration.parsed(fromURL: url(withName: "pia-hungary"), returnsStripped: true).strippedLines! let stripped = lines.joined(separator: "\n") print(stripped) }