Locate profiles via relative URLs

Avoid absolute URLs, profiles directory is always relative to
documents. Assume profiles to be based in the documents root
unless directory is != nil.

Given that, starting from iOS 8, the documents location can change
from time to time, could this fix #19?
This commit is contained in:
Davide De Rosa 2018-11-01 13:25:33 +01:00
parent 2197c96bd9
commit 36995e089b
3 changed files with 10 additions and 13 deletions

View File

@ -59,7 +59,7 @@ extension ConnectionService {
func pendingConfigurationURLs() -> [URL] { func pendingConfigurationURLs() -> [URL] {
do { do {
let list = try FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil, options: []) let list = try FileManager.default.contentsOfDirectory(at: rootURL, includingPropertiesForKeys: nil, options: [])
return list.filter { $0.pathExtension == "ovpn" } return list.filter { $0.pathExtension == "ovpn" }
} catch let e { } catch let e {
log.error("Could not list imported configurations: \(e)") log.error("Could not list imported configurations: \(e)")

View File

@ -83,14 +83,18 @@ class ConnectionService: Codable {
} }
} }
lazy var directory = FileManager.default.userURL(for: .documentDirectory, appending: nil) var directory: String? = nil
var rootURL: URL {
return FileManager.default.userURL(for: .documentDirectory, appending: directory)
}
private var providersURL: URL { private var providersURL: URL {
return directory.appendingPathComponent(AppConstants.Store.providersDirectory) return rootURL.appendingPathComponent(AppConstants.Store.providersDirectory)
} }
private var hostsURL: URL { private var hostsURL: URL {
return directory.appendingPathComponent(AppConstants.Store.hostsDirectory) return rootURL.appendingPathComponent(AppConstants.Store.hostsDirectory)
} }
private var build: Int private var build: Int

View File

@ -35,12 +35,10 @@ class TransientStore {
static let shared = TransientStore() static let shared = TransientStore()
private let rootURL: URL
private let serviceURL: URL
let service: ConnectionService let service: ConnectionService
private let serviceURL = FileManager.default.userURL(for: .documentDirectory, appending: AppConstants.Store.serviceFilename)
var didHandleSubreddit: Bool { var didHandleSubreddit: Bool {
get { get {
return UserDefaults.standard.bool(forKey: Keys.didHandleSubreddit) return UserDefaults.standard.bool(forKey: Keys.didHandleSubreddit)
@ -51,9 +49,6 @@ class TransientStore {
} }
private init() { private init() {
rootURL = FileManager.default.userURL(for: .documentDirectory, appending: nil)
serviceURL = rootURL.appendingPathComponent(AppConstants.Store.serviceFilename)
let cfg = AppConstants.VPN.baseConfiguration() let cfg = AppConstants.VPN.baseConfiguration()
do { do {
ConnectionService.migrateJSON(at: serviceURL, to: serviceURL) ConnectionService.migrateJSON(at: serviceURL, to: serviceURL)
@ -64,7 +59,6 @@ class TransientStore {
log.verbose(content) log.verbose(content)
} }
service = try JSONDecoder().decode(ConnectionService.self, from: data) service = try JSONDecoder().decode(ConnectionService.self, from: data)
service.directory = rootURL
service.baseConfiguration = cfg service.baseConfiguration = cfg
service.loadProfiles() service.loadProfiles()
} catch let e { } catch let e {
@ -73,7 +67,6 @@ class TransientStore {
withAppGroup: GroupConstants.App.appGroup, withAppGroup: GroupConstants.App.appGroup,
baseConfiguration: cfg baseConfiguration: cfg
) )
service.directory = rootURL
// // hardcoded loading // // hardcoded loading
// _ = service.addProfile(ProviderConnectionProfile(name: .pia), credentials: nil) // _ = service.addProfile(ProviderConnectionProfile(name: .pia), credentials: nil)