diff --git a/XrayConfig.swift b/XrayConfig.swift new file mode 100644 index 00000000..9c47a2a1 --- /dev/null +++ b/XrayConfig.swift @@ -0,0 +1,7 @@ +import Foundation + +struct XrayConfig: Decodable { + let dns1: String? + let dns2: String? + let config: String +} diff --git a/client/platforms/ios/PacketTunnelProvider+Xray.swift b/client/platforms/ios/PacketTunnelProvider+Xray.swift index 277980d6..74d88e8e 100644 --- a/client/platforms/ios/PacketTunnelProvider+Xray.swift +++ b/client/platforms/ios/PacketTunnelProvider+Xray.swift @@ -4,6 +4,7 @@ import WireGuardKitGo enum XrayErrors: Error { case noXrayConfig + case xrayConfigIsWrong case cantSaveXrayConfig case cantParseListenAndPort case cantSaveHevSocksConfig @@ -26,7 +27,7 @@ extension PacketTunnelProvider { // Xray configuration guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, let providerConfiguration = protocolConfiguration.providerConfiguration, - let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else { + let configData = providerConfiguration[Constants.xrayConfigKey] as? Data else { xrayLog(.error, message: "Can't get xray configuration") completionHandler(XrayErrors.noXrayConfig) return @@ -57,12 +58,29 @@ extension PacketTunnelProvider { return settings }() - let dns = ["8.8.4.4","1.1.1.1"] - settings.dnsSettings = NEDNSSettings(servers: dns) - do { - let port = 10808 - let address = "::1" + let xrayConfig = try JSONDecoder().decode(XrayConfig.self, + from: configData) + + var dnsArray = [String]() + if let dns1 = xrayConfig.dns1 { + dnsArray.append(dns1) + } + if let dns2 = xrayConfig.dns2 { + dnsArray.append(dns2) + } + + settings.dnsSettings = !dnsArray.isEmpty + ? NEDNSSettings(servers: dnsArray) + : NEDNSSettings(servers: ["1.1.1.1"]) + + let xrayConfigData = xrayConfig.config.data(using: .utf8) + + guard let xrayConfigData else { + xrayLog(.error, message: "Can't encode config to data") + completionHandler(XrayErrors.xrayConfigIsWrong) + return + } let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData, options: []) as? [String: Any] @@ -73,6 +91,9 @@ extension PacketTunnelProvider { return } + let port = 10808 + let address = "::1" + if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty { inboundsArray[0]["port"] = port inboundsArray[0]["listen"] = address diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index b335e098..f4ba2798 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -511,18 +511,36 @@ bool IosController::setupXray() { QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Xray)].toObject(); QJsonDocument xrayConfigDoc(config); + QString xrayConfigStr(xrayConfigDoc.toJson(QJsonDocument::Compact)); - return startXray(xrayConfigStr); + QJsonObject finalConfig; + finalConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1].toString()); + finalConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2].toString()); + finalConfig.insert(config_key::config, xrayConfigStr); + + QJsonDocument finalConfigDoc(finalConfig); + QString finalConfigStr(finalConfigDoc.toJson(QJsonDocument::Compact)); + + return startXray(finalConfigStr); } bool IosController::setupSSXray() { QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::SSXray)].toObject(); QJsonDocument ssXrayConfigDoc(config); + QString ssXrayConfigStr(ssXrayConfigDoc.toJson(QJsonDocument::Compact)); - return startXray(ssXrayConfigStr); + QJsonObject finalConfig; + finalConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]); + finalConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]); + finalConfig.insert(config_key::config, ssXrayConfigStr); + + QJsonDocument finalConfigDoc(finalConfig); + QString finalConfigStr(finalConfigDoc.toJson(QJsonDocument::Compact)); + + return startXray(finalConfigStr); } bool IosController::setupAwg()