Refactor configurations in service extension
Reuse same directories of ConnectionService for storing configuration files.
This commit is contained in:
parent
4388dfe6ae
commit
821393af70
|
@ -159,8 +159,8 @@ class WizardHostViewController: UITableViewController, TableModelHost, Wizard {
|
||||||
}
|
}
|
||||||
if let url = parsedFile?.url {
|
if let url = parsedFile?.url {
|
||||||
do {
|
do {
|
||||||
let savedUrl = try ProfileConfigurationFactory.shared.save(url: url, for: profile)
|
let savedURL = try TransientStore.shared.service.save(configurationURL: url, for: profile)
|
||||||
log.debug("Associated .ovpn configuration file to profile '\(profile.id)': \(savedUrl)")
|
log.debug("Associated .ovpn configuration file to profile '\(profile.id)': \(savedURL)")
|
||||||
} catch let e {
|
} catch let e {
|
||||||
log.error("Could not associate .ovpn configuration file to profile: \(e)")
|
log.error("Could not associate .ovpn configuration file to profile: \(e)")
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ class ServiceViewController: UIViewController, TableModelHost {
|
||||||
let vc = destination as? ConfigurationViewController
|
let vc = destination as? ConfigurationViewController
|
||||||
vc?.title = L10n.Service.Cells.Host.Parameters.caption
|
vc?.title = L10n.Service.Cells.Host.Parameters.caption
|
||||||
vc?.initialConfiguration = uncheckedHostProfile.parameters.sessionConfiguration
|
vc?.initialConfiguration = uncheckedHostProfile.parameters.sessionConfiguration
|
||||||
vc?.originalConfigurationURL = ProfileConfigurationFactory.shared.configurationURL(for: uncheckedHostProfile)
|
vc?.originalConfigurationURL = service.configurationURL(for: uncheckedHostProfile)
|
||||||
vc?.delegate = self
|
vc?.delegate = self
|
||||||
|
|
||||||
case .debugLogSegueIdentifier:
|
case .debugLogSegueIdentifier:
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
0E1D72B4213C118500BA1586 /* ConfigurationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1D72B3213C118500BA1586 /* ConfigurationViewController.swift */; };
|
0E1D72B4213C118500BA1586 /* ConfigurationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1D72B3213C118500BA1586 /* ConfigurationViewController.swift */; };
|
||||||
0E2B494020FCFF990094784C /* Theme+Titles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2B493F20FCFF990094784C /* Theme+Titles.swift */; };
|
0E2B494020FCFF990094784C /* Theme+Titles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2B493F20FCFF990094784C /* Theme+Titles.swift */; };
|
||||||
0E2B494220FD16540094784C /* TransientStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2B494120FD16540094784C /* TransientStore.swift */; };
|
0E2B494220FD16540094784C /* TransientStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2B494120FD16540094784C /* TransientStore.swift */; };
|
||||||
0E2D11BA217DBEDE0096822C /* ProfileConfigurationFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2D11B9217DBEDE0096822C /* ProfileConfigurationFactory.swift */; };
|
0E2D11BA217DBEDE0096822C /* ConnectionService+Configurations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2D11B9217DBEDE0096822C /* ConnectionService+Configurations.swift */; };
|
||||||
0E39BCF0214B9EF10035E9DE /* WebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E39BCEF214B9EF10035E9DE /* WebServices.swift */; };
|
0E39BCF0214B9EF10035E9DE /* WebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E39BCEF214B9EF10035E9DE /* WebServices.swift */; };
|
||||||
0E39BCF3214DA9310035E9DE /* AppConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E39BCF2214DA9310035E9DE /* AppConstants.swift */; };
|
0E39BCF3214DA9310035E9DE /* AppConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E39BCF2214DA9310035E9DE /* AppConstants.swift */; };
|
||||||
0E3DA371215CB5BF00B40FC9 /* VersionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3DA370215CB5BF00B40FC9 /* VersionViewController.swift */; };
|
0E3DA371215CB5BF00B40FC9 /* VersionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3DA370215CB5BF00B40FC9 /* VersionViewController.swift */; };
|
||||||
|
@ -137,7 +137,7 @@
|
||||||
0E1D72B3213C118500BA1586 /* ConfigurationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationViewController.swift; sourceTree = "<group>"; };
|
0E1D72B3213C118500BA1586 /* ConfigurationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationViewController.swift; sourceTree = "<group>"; };
|
||||||
0E2B493F20FCFF990094784C /* Theme+Titles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+Titles.swift"; sourceTree = "<group>"; };
|
0E2B493F20FCFF990094784C /* Theme+Titles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+Titles.swift"; sourceTree = "<group>"; };
|
||||||
0E2B494120FD16540094784C /* TransientStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientStore.swift; sourceTree = "<group>"; };
|
0E2B494120FD16540094784C /* TransientStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientStore.swift; sourceTree = "<group>"; };
|
||||||
0E2D11B9217DBEDE0096822C /* ProfileConfigurationFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileConfigurationFactory.swift; sourceTree = "<group>"; };
|
0E2D11B9217DBEDE0096822C /* ConnectionService+Configurations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConnectionService+Configurations.swift"; sourceTree = "<group>"; };
|
||||||
0E39BCEF214B9EF10035E9DE /* WebServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServices.swift; sourceTree = "<group>"; };
|
0E39BCEF214B9EF10035E9DE /* WebServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServices.swift; sourceTree = "<group>"; };
|
||||||
0E39BCF2214DA9310035E9DE /* AppConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConstants.swift; sourceTree = "<group>"; };
|
0E39BCF2214DA9310035E9DE /* AppConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConstants.swift; sourceTree = "<group>"; };
|
||||||
0E3DA370215CB5BF00B40FC9 /* VersionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionViewController.swift; sourceTree = "<group>"; };
|
0E3DA370215CB5BF00B40FC9 /* VersionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionViewController.swift; sourceTree = "<group>"; };
|
||||||
|
@ -382,12 +382,12 @@
|
||||||
0EBE3AA2213DC1B000BFA2F5 /* Profiles */,
|
0EBE3AA2213DC1B000BFA2F5 /* Profiles */,
|
||||||
0EBE3A9E213DC1A100BFA2F5 /* ConnectionProfile.swift */,
|
0EBE3A9E213DC1A100BFA2F5 /* ConnectionProfile.swift */,
|
||||||
0EBE3A9F213DC1A100BFA2F5 /* ConnectionService.swift */,
|
0EBE3A9F213DC1A100BFA2F5 /* ConnectionService.swift */,
|
||||||
|
0E2D11B9217DBEDE0096822C /* ConnectionService+Configurations.swift */,
|
||||||
0EBBE8F42182361700106008 /* ConnectionService+Migration.swift */,
|
0EBBE8F42182361700106008 /* ConnectionService+Migration.swift */,
|
||||||
0EDE8DE620C93945004C739C /* Credentials.swift */,
|
0EDE8DE620C93945004C739C /* Credentials.swift */,
|
||||||
0EC7F20420E24308004EA58E /* DebugLog.swift */,
|
0EC7F20420E24308004EA58E /* DebugLog.swift */,
|
||||||
0ED38AE621404F100004D387 /* EndpointDataSource.swift */,
|
0ED38AE621404F100004D387 /* EndpointDataSource.swift */,
|
||||||
0E89DFC4213DF7AE00741BA1 /* Preferences.swift */,
|
0E89DFC4213DF7AE00741BA1 /* Preferences.swift */,
|
||||||
0E2D11B9217DBEDE0096822C /* ProfileConfigurationFactory.swift */,
|
|
||||||
0E89DFC7213E8FC500741BA1 /* SessionProxy+Communication.swift */,
|
0E89DFC7213E8FC500741BA1 /* SessionProxy+Communication.swift */,
|
||||||
0E2B494120FD16540094784C /* TransientStore.swift */,
|
0E2B494120FD16540094784C /* TransientStore.swift */,
|
||||||
0E4C9CB820DB9BC600A0C59C /* TrustedNetworks.swift */,
|
0E4C9CB820DB9BC600A0C59C /* TrustedNetworks.swift */,
|
||||||
|
@ -842,7 +842,7 @@
|
||||||
0ED31C1220CF0ABA0027975F /* Infrastructure.swift in Sources */,
|
0ED31C1220CF0ABA0027975F /* Infrastructure.swift in Sources */,
|
||||||
0EC7F20520E24308004EA58E /* DebugLog.swift in Sources */,
|
0EC7F20520E24308004EA58E /* DebugLog.swift in Sources */,
|
||||||
0E4FD7E120D3E4C5002221FF /* MockVPNProvider.swift in Sources */,
|
0E4FD7E120D3E4C5002221FF /* MockVPNProvider.swift in Sources */,
|
||||||
0E2D11BA217DBEDE0096822C /* ProfileConfigurationFactory.swift in Sources */,
|
0E2D11BA217DBEDE0096822C /* ConnectionService+Configurations.swift in Sources */,
|
||||||
0EBE3A90213C6F4000BFA2F5 /* TrustPolicy.swift in Sources */,
|
0EBE3A90213C6F4000BFA2F5 /* TrustPolicy.swift in Sources */,
|
||||||
0E6BE13F20CFBAB300A6DD36 /* DebugLogViewController.swift in Sources */,
|
0E6BE13F20CFBAB300A6DD36 /* DebugLogViewController.swift in Sources */,
|
||||||
0E89DFC8213E8FC500741BA1 /* SessionProxy+Communication.swift in Sources */,
|
0E89DFC8213E8FC500741BA1 /* SessionProxy+Communication.swift in Sources */,
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
//
|
||||||
|
// ConnectionService+Configurations.swift
|
||||||
|
// Passepartout
|
||||||
|
//
|
||||||
|
// Created by Davide De Rosa on 10/22/18.
|
||||||
|
// Copyright (c) 2018 Davide De Rosa. All rights reserved.
|
||||||
|
//
|
||||||
|
// https://github.com/keeshux
|
||||||
|
//
|
||||||
|
// This file is part of Passepartout.
|
||||||
|
//
|
||||||
|
// Passepartout is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Passepartout is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension ConnectionService {
|
||||||
|
func save(configurationURL: URL, for profile: ConnectionProfile) throws -> URL {
|
||||||
|
let destinationURL = targetConfigurationURL(for: profile)
|
||||||
|
let fm = FileManager.default
|
||||||
|
try? fm.removeItem(at: destinationURL)
|
||||||
|
try fm.copyItem(at: configurationURL, to: destinationURL)
|
||||||
|
return destinationURL
|
||||||
|
}
|
||||||
|
|
||||||
|
func configurationURL(for profile: ConnectionProfile) -> URL? {
|
||||||
|
let url = targetConfigurationURL(for: profile)
|
||||||
|
guard FileManager.default.fileExists(atPath: url.path) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
private func targetConfigurationURL(for profile: ConnectionProfile) -> URL {
|
||||||
|
let contextURL = ConnectionService.ProfileKey(profile).contextURL(in: self)
|
||||||
|
return contextURL.appendingPathComponent("\(profile.id).ovpn")
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,19 +64,21 @@ class ConnectionService: Codable {
|
||||||
id = profile.id
|
id = profile.id
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func profileURL(in service: ConnectionService) -> URL {
|
func contextURL(in service: ConnectionService) -> URL {
|
||||||
let contextURL: URL
|
|
||||||
switch context {
|
switch context {
|
||||||
case .provider:
|
case .provider:
|
||||||
contextURL = service.providersURL
|
return service.providersURL
|
||||||
|
|
||||||
case .host:
|
case .host:
|
||||||
contextURL = service.hostsURL
|
return service.hostsURL
|
||||||
}
|
}
|
||||||
return ConnectionService.url(in: contextURL, forProfileId: id)
|
}
|
||||||
|
|
||||||
|
func profileURL(in service: ConnectionService) -> URL {
|
||||||
|
return ConnectionService.url(in: contextURL(in: service), forProfileId: id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func profileData(in service: ConnectionService) throws -> Data {
|
func profileData(in service: ConnectionService) throws -> Data {
|
||||||
return try Data(contentsOf: profileURL(in: service))
|
return try Data(contentsOf: profileURL(in: service))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
//
|
|
||||||
// ProfileConfigurationFactory.swift
|
|
||||||
// Passepartout
|
|
||||||
//
|
|
||||||
// Created by Davide De Rosa on 10/22/18.
|
|
||||||
// Copyright (c) 2018 Davide De Rosa. All rights reserved.
|
|
||||||
//
|
|
||||||
// https://github.com/keeshux
|
|
||||||
//
|
|
||||||
// This file is part of Passepartout.
|
|
||||||
//
|
|
||||||
// Passepartout is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Passepartout is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
protocol ProfileConfigurationSource {
|
|
||||||
var id: String { get }
|
|
||||||
|
|
||||||
var profileDirectory: String { get }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension ProfileConfigurationSource {
|
|
||||||
var profileConfigurationPath: String {
|
|
||||||
return "\(profileDirectory)/\(id).ovpn"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension ProviderConnectionProfile: ProfileConfigurationSource {
|
|
||||||
var profileDirectory: String {
|
|
||||||
return AppConstants.Store.providersDirectory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension HostConnectionProfile: ProfileConfigurationSource {
|
|
||||||
var profileDirectory: String {
|
|
||||||
return AppConstants.Store.hostsDirectory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ProfileConfigurationFactory {
|
|
||||||
static let shared = ProfileConfigurationFactory()
|
|
||||||
|
|
||||||
private let configurationsPath: URL
|
|
||||||
|
|
||||||
private init() {
|
|
||||||
let fm = FileManager.default
|
|
||||||
configurationsPath = fm.userURL(for: .documentDirectory, appending: nil)
|
|
||||||
try? fm.createDirectory(at: configurationsPath, withIntermediateDirectories: false, attributes: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func save(url: URL, for profile: ProfileConfigurationSource) throws -> URL {
|
|
||||||
let savedUrl = targetConfigurationURL(for: profile)
|
|
||||||
let fm = FileManager.default
|
|
||||||
try? fm.removeItem(at: savedUrl)
|
|
||||||
try fm.copyItem(at: url, to: savedUrl)
|
|
||||||
return savedUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
func configurationURL(for profile: ProfileConfigurationSource) -> URL? {
|
|
||||||
let url = targetConfigurationURL(for: profile)
|
|
||||||
guard FileManager.default.fileExists(atPath: url.path) else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return url
|
|
||||||
}
|
|
||||||
|
|
||||||
private func targetConfigurationURL(for profile: ProfileConfigurationSource) -> URL {
|
|
||||||
return configurationsPath.appendingPathComponent(profile.profileConfigurationPath)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue