In order to avoid chaos from multiple profiles, retain the profile to be installed and remove all the other ones. Also, make sure to do the removal AFTER install, as doing it before would trigger the VPN permission alert again. XXX: there is some weird behavior from NetworkExtension occasionally sending notifications with a bogus NEVPNManager object having a nil .localizedDescription and other properties set to nonsensical values. Discard the notification when such an object is identified. Encapsulate extra NetworkExtension settings: - passwordReference - onDemandRules - disconnectsOnSleep Also: - Only set on-demand if any rules are set - Assume VPN is enabled even with on-demand disabled - Use DataCount instead of raw Int pair Attach useful information to VPN notifications: - VPN isEnabled - VPN status - VPN command error - Tunnel bundle identifier (if available) Expose specific OpenVPN/WireGuard shared data via extensions in UserDefaults/FileManager. Finally, drop incomplete IKE support. No fit.
59 lines
1.8 KiB
Swift
59 lines
1.8 KiB
Swift
//
|
|
// NetworkExtensionConfiguration.swift
|
|
// TunnelKit
|
|
//
|
|
// Created by Davide De Rosa on 9/18/18.
|
|
// Copyright (c) 2022 Davide De Rosa. All rights reserved.
|
|
//
|
|
// https://github.com/passepartoutvpn
|
|
//
|
|
// This file is part of TunnelKit.
|
|
//
|
|
// TunnelKit 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.
|
|
//
|
|
// TunnelKit 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 TunnelKit. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
import Foundation
|
|
import NetworkExtension
|
|
|
|
/// :nodoc:
|
|
public struct NetworkExtensionExtra {
|
|
public var passwordReference: Data?
|
|
|
|
public var onDemandRules: [NEOnDemandRule] = []
|
|
|
|
public var disconnectsOnSleep = false
|
|
|
|
public init() {
|
|
}
|
|
}
|
|
|
|
/// Configuration object to feed to a `NetworkExtensionProvider`.
|
|
public protocol NetworkExtensionConfiguration {
|
|
|
|
/// The profile title in device settings.
|
|
var title: String { get }
|
|
|
|
/**
|
|
Returns a representation for use with tunnel implementations.
|
|
|
|
- Parameter bundleIdentifier: The bundle identifier of the tunnel extension.
|
|
- Parameter extra: The optional `Extra` arguments.
|
|
- Returns An object to use with tunnel implementations.
|
|
*/
|
|
func asTunnelProtocol(
|
|
withBundleIdentifier bundleIdentifier: String,
|
|
extra: NetworkExtensionExtra?
|
|
) throws -> NETunnelProviderProtocol
|
|
}
|