diff --git a/CHANGELOG.md b/CHANGELOG.md index d0bc288..8c762f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,20 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed + +- Debug log is saved to group container rather than `UserDefaults`. [#43](https://github.com/keeshux/tunnelkit/pull/43) + +### Fixed + +- Handle server-initiated renegotiation. [#41](https://github.com/keeshux/tunnelkit/pull/41) +- Potentially private data (e.g. Internet addresses) is now masked in debug log. [#42](https://github.com/keeshux/tunnelkit/pull/42) + +## 1.2.1 (2018-10-24) + ### Added - Configuration key `lastErrorKey` for reporting errors to host app. [#40](https://github.com/keeshux/tunnelkit/pull/40) - Server extended key usage validation (EKU). [#27](https://github.com/keeshux/tunnelkit/issues/27) -### Changed - -- Potentially private data (e.g. Internet addresses) is now masked in debug log. [#42](https://github.com/keeshux/tunnelkit/pull/42) - ### Fixed - CA file was not closed after MD5 calculation when using PIA patches. - Mitigated an issue with MTU in TCP mode during negotiation. [#39](https://github.com/keeshux/tunnelkit/issues/39) -- Handle server-initiated renegotiation. [#41](https://github.com/keeshux/tunnelkit/pull/41) ## 1.2.0 (2018-10-20) diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 29ebc88..c4e5a6b 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -1,13 +1,13 @@ PODS: - OpenSSL-Apple (1.1.0i-v2) - SwiftyBeaver (1.6.1) - - TunnelKit (1.1.2): - - TunnelKit/AppExtension (= 1.1.2) - - TunnelKit/Core (= 1.1.2) - - TunnelKit/AppExtension (1.1.2): + - TunnelKit (1.2.2): + - TunnelKit/AppExtension (= 1.2.2) + - TunnelKit/Core (= 1.2.2) + - TunnelKit/AppExtension (1.2.2): - SwiftyBeaver - TunnelKit/Core - - TunnelKit/Core (1.1.2): + - TunnelKit/Core (1.2.2): - OpenSSL-Apple (~> 1.1.0h) - SwiftyBeaver @@ -26,8 +26,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: OpenSSL-Apple: a93b8f2eec8783ff40d9a9304de180ab68bb647c SwiftyBeaver: ccfcdf85a04d429f1633f668650b0ce8020bda3a - TunnelKit: 392e78dd45cded30a6f814200b8334c33901f677 + TunnelKit: 15c88f0cef7b926883566a9455e912a1e55f4048 PODFILE CHECKSUM: f66dfaaa92a8d04ab2743f3caeab0ac9f9f25859 -COCOAPODS: 1.6.0.beta.1 +COCOAPODS: 1.6.0.beta.2 diff --git a/TunnelKit.podspec b/TunnelKit.podspec index 5b55096..2982fb2 100644 --- a/TunnelKit.podspec +++ b/TunnelKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "TunnelKit" - s.version = "1.2.1" + s.version = "1.2.2" s.summary = "Non-official OpenVPN client for Apple platforms." s.homepage = "https://github.com/keeshux/tunnelkit" diff --git a/TunnelKit.xcodeproj/project.pbxproj b/TunnelKit.xcodeproj/project.pbxproj index 995d89f..615d2d2 100644 --- a/TunnelKit.xcodeproj/project.pbxproj +++ b/TunnelKit.xcodeproj/project.pbxproj @@ -1144,7 +1144,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 245; + CURRENT_PROJECT_VERSION = 273; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -1208,7 +1208,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 245; + CURRENT_PROJECT_VERSION = 273; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1241,7 +1241,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 245; + DYLIB_CURRENT_VERSION = 273; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "$(SRCROOT)/TunnelKit-iOS/Info.plist"; @@ -1264,7 +1264,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 245; + DYLIB_CURRENT_VERSION = 273; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "$(SRCROOT)/TunnelKit-iOS/Info.plist"; @@ -1287,7 +1287,7 @@ COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 245; + DYLIB_CURRENT_VERSION = 273; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/TunnelKit-macOS/Info.plist"; @@ -1310,7 +1310,7 @@ COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 245; + DYLIB_CURRENT_VERSION = 273; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/TunnelKit-macOS/Info.plist"; diff --git a/TunnelKit/Sources/AppExtension/MemoryDestination.swift b/TunnelKit/Sources/AppExtension/MemoryDestination.swift index 4630a23..973c795 100644 --- a/TunnelKit/Sources/AppExtension/MemoryDestination.swift +++ b/TunnelKit/Sources/AppExtension/MemoryDestination.swift @@ -54,11 +54,11 @@ class MemoryDestination: BaseDestination, CustomStringConvertible { } } - func flush(to: UserDefaults, with key: String) { + func flush(to url: URL) { execute(synchronously: true) { - to.set(self.buffer, forKey: key) + let content = self.buffer.joined(separator: "\n") + try? content.write(to: url, atomically: true, encoding: .utf8) } - to.synchronize() } var description: String { diff --git a/TunnelKit/Sources/AppExtension/TunnelKitProvider+Configuration.swift b/TunnelKit/Sources/AppExtension/TunnelKitProvider+Configuration.swift index 8b9b297..6656453 100644 --- a/TunnelKit/Sources/AppExtension/TunnelKitProvider+Configuration.swift +++ b/TunnelKit/Sources/AppExtension/TunnelKitProvider+Configuration.swift @@ -159,7 +159,7 @@ extension TunnelKitProvider { /// Enables debugging. If `true`, then `debugLogKey` is a mandatory field. public var shouldDebug: Bool - /// The key in `defaults` where the latest debug log snapshot is stored. Ignored if `shouldDebug` is `false`. + /// The filename in group container where the latest debug log snapshot is stored. Ignored if `shouldDebug` is `false`. public var debugLogKey: String? /// Optional debug log format (SwiftyBeaver format). @@ -403,12 +403,34 @@ extension TunnelKitProvider { public let lastErrorKey: String? // MARK: Shortcuts + + /** + Returns the URL of the latest debug log. - func existingLog(in defaults: UserDefaults) -> [String]? { + - Parameter in: The app group where to locate the log file. + - Returns: The URL of the debug log, if any. + */ + public func urlForLog(in appGroup: String) -> URL? { guard shouldDebug, let key = debugLogKey else { return nil } - return defaults.array(forKey: key) as? [String] + guard let parentURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) else { + return nil + } + return parentURL.appendingPathComponent("\(key).log") + } + + /** + Returns the content of the latest debug log. + + - Parameter in: The app group where to locate the log file. + - Returns: The content of the debug log, if any. + */ + public func existingLog(in appGroup: String) -> String? { + guard let url = urlForLog(in: appGroup) else { + return nil + } + return try? String(contentsOf: url) } // MARK: API diff --git a/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift b/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift index a8c3594..35e867c 100644 --- a/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift +++ b/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift @@ -94,12 +94,12 @@ open class TunnelKitProvider: NEPacketTunnelProvider { private var appGroup: String! + private lazy var defaults = UserDefaults(suiteName: appGroup) + private var cfg: Configuration! private var strategy: ConnectionStrategy! - private lazy var defaults = UserDefaults(suiteName: appGroup) - // MARK: Internal state private var proxy: SessionProxy? @@ -157,7 +157,8 @@ open class TunnelKitProvider: NEPacketTunnelProvider { strategy = ConnectionStrategy(hostname: hostname, configuration: cfg) - if let defaults = defaults, var existingLog = cfg.existingLog(in: defaults) { + if let content = cfg.existingLog(in: appGroup) { + var existingLog = content.components(separatedBy: "\n") if let i = existingLog.index(of: logSeparator) { existingLog.removeFirst(i + 2) } @@ -595,8 +596,8 @@ extension TunnelKitProvider { private func flushLog() { log.debug("Flushing log...") - if let defaults = defaults, let key = cfg.debugLogKey { - memoryLog.flush(to: defaults, with: key) + if let url = cfg.urlForLog(in: appGroup) { + memoryLog.flush(to: url) } } diff --git a/TunnelKitHost/Info.plist b/TunnelKitHost/Info.plist index b2518c5..587f3d4 100644 --- a/TunnelKitHost/Info.plist +++ b/TunnelKitHost/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.1 + 1.2.2 CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/TunnelKitTests/Info.plist b/TunnelKitTests/Info.plist index 0bbce46..88f2dd1 100644 --- a/TunnelKitTests/Info.plist +++ b/TunnelKitTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.2.1 + 1.2.2 CFBundleVersion 1