This is the swift code:
import Foundation
import NetworkExtension
import KeychainAccess
@objc(VPNManager)
class VPNManager: NSObject {
@objc
static func requiresMainQueueSetup() -> Bool {
return true
}
@objc
func connectToVPN(_ config: NSDictionary, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
print("Received config: (config)")
guard let serverAddress = config["serverAddress"] as? String,
let account = config["account"] as? String,
let password = config["password"] as? String,
let sharedSecret = config["sharedSecret"] as? String else {
rejecter("error", "Invalid configuration", nil)
return
}
print("Server Address: \(serverAddress)")
print("Account: \(account)")
print("Password: \(password)")
print("Shared Secret: \(sharedSecret)")
let vpnManager = NEVPNManager.shared()
vpnManager.loadFromPreferences { error in
if let error = error {
rejecter("error", "Failed to load preferences: \(error.localizedDescription)", error)
return
}
let p = NEVPNProtocolIPSec()
p.serverAddress = serverAddress
p.authenticationMethod = .sharedSecret
p.localIdentifier = account
p.remoteIdentifier = serverAddress
p.username = account
// Store shared secret and password in Keychain
let keychain = Keychain(service: "com.yourcompany.FreeVpnApp")
do {
try keychain.set(sharedSecret, key: "VPN_SHARED_SECRET")
guard let sharedSecretData = try keychain.getData("VPN_SHARED_SECRET") else {
rejecter("error", "No VPN shared secret was found", nil)
return
}
p.sharedSecretReference = sharedSecretData
try keychain.set(password, key: "VPN_PASSWORD")
guard let passwordData = try keychain.getData("VPN_PASSWORD") else {
rejecter("error", "No VPN password was found", nil)
return
}
p.passwordReference = passwordData
} catch let keychainError {
rejecter("error", "Failed to store password or shared secret: \(keychainError.localizedDescription)", keychainError)
return
}
p.useExtendedAuthentication = true
p.disconnectOnSleep = false
vpnManager.protocolConfiguration = p
vpnManager.localizedDescription = "AGVPN"
vpnManager.isEnabled = true
vpnManager.saveToPreferences { error in
if let error = error {
rejecter("error", "Failed to save preferences: \(error.localizedDescription)", error)
return
}
do {
try vpnManager.connection.startVPNTunnel()
resolver("Connected to VPN")
} catch {
rejecter("error", "Failed to start VPN tunnel: \(error.localizedDescription)", error)
}
}
}
}
@objc
func disconnectFromVPN(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
let vpnManager = NEVPNManager.shared()
vpnManager.connection.stopVPNTunnel()
resolver("Disconnected from VPN")
}
}