From fa341c9a5a7b88d719ee6a056007adbf7fc3011d Mon Sep 17 00:00:00 2001 From: Tamim Hossain <132823494+CodeWithTamim@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:31:44 +0600 Subject: [PATCH] Added wireguard regular config parsing feature, which we discussed on issue #3497 (#3521) --- .../com/v2ray/ang/util/AngConfigManager.kt | 7 ++++ .../com/v2ray/ang/util/fmt/WireguardFmt.kt | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt index beda150f..07fb457c 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt @@ -517,6 +517,13 @@ object AngConfigManager { val key = MmkvManager.encodeServerConfig("", config) serverRawStorage?.encode(key, server) return 1 + } else if (server.startsWith("[Interface]") && server.contains("[Peer]")) { + val config = WireguardFmt.parseWireguardConfFile(server) + ?: return R.string.toast_incorrect_protocol + config.fullConfig?.remarks ?: System.currentTimeMillis().toString() + val key = MmkvManager.encodeServerConfig("", config) + serverRawStorage?.encode(key, server) + return 1 } else { return 0 } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt index 34fb2eff..7f4286cb 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt @@ -38,6 +38,40 @@ object WireguardFmt { } } + fun parseWireguardConfFile(str: String): ServerConfig? { + val config = ServerConfig.create(EConfigType.WIREGUARD) + val queryParam: MutableMap = mutableMapOf() + + var currentSection: String? = null + + str.lines().forEach { line -> + val trimmedLine = line.trim() + + when { + trimmedLine.startsWith("[Interface]", ignoreCase = true) -> currentSection = "Interface" + trimmedLine.startsWith("[Peer]", ignoreCase = true) -> currentSection = "Peer" + trimmedLine.isBlank() || trimmedLine.startsWith("#") -> Unit // Skip blank lines or comments + currentSection != null -> { + val (key, value) = trimmedLine.split("=").map { it.trim() } + queryParam[key.lowercase()] = value // Store the key in lowercase for case-insensitivity + } + } + } + + config.outboundBean?.settings?.let { wireguard -> + wireguard.secretKey = queryParam["privatekey"].orEmpty() + wireguard.address = (queryParam["address"] ?: AppConfig.WIREGUARD_LOCAL_ADDRESS_V4).removeWhiteSpace().split(",") + wireguard.peers?.getOrNull(0)?.publicKey = queryParam["publickey"].orEmpty() + wireguard.peers?.getOrNull(0)?.endpoint = queryParam["endpoint"].orEmpty() + wireguard.mtu = Utils.parseInt(queryParam["mtu"] ?: AppConfig.WIREGUARD_LOCAL_MTU) + wireguard.reserved = (queryParam["reserved"] ?: "0,0,0").removeWhiteSpace().split(",").map { it.toInt() } + } + + return config + } + + + fun toUri(config: ServerConfig): String { val outbound = config.getProxyOutbound() ?: return ""