Fix wireguard config

This commit is contained in:
alexkosh 2021-10-23 23:06:50 +03:00
parent 421f665e85
commit 4de38a295c

View file

@ -287,46 +287,72 @@ class VPNService : android.net.VpnService() {
return null return null
} }
private fun parseConfigData(data: String): Map<String, Map<String, String>> {
val parseData = mutableMapOf<String, Map<String, String>>()
var currentSection: Pair<String, MutableMap<String, String>>? = null
data.lines().forEach { line ->
if (line.isNotEmpty()) {
if (line.startsWith('[')) {
currentSection?.let {
parseData.put(it.first, it.second)
}
currentSection = line.substring(1, line.indexOfLast { it == ']' }) to mutableMapOf()
} else {
val parameter = line.split("=", limit = 2)
currentSection!!.second.put(parameter.first().trim(), parameter.last().trim())
}
}
}
currentSection?.let {
parseData.put(it.first, it.second)
}
return parseData
}
/** /**
* Create a Wireguard [Config] from a [json] string - * Create a Wireguard [Config] from a [json] string -
* The [json] will be created in AndroidVpnProtocol.cpp * The [json] will be created in AndroidVpnProtocol.cpp
*/ */
private fun buildWireugardConfig(obj: JSONObject): Config { private fun buildWireugardConfig(obj: JSONObject): Config {
val confBuilder = Config.Builder() val confBuilder = Config.Builder()
val jServer = obj.getJSONObject("server") val wireguardConfigData = obj.getJSONObject("wireguard_config_data")
val config = parseConfigData(wireguardConfigData.getString("config"))
val peerBuilder = Peer.Builder() val peerBuilder = Peer.Builder()
val ep = val peerConfig = config["Peer"]!!
InetEndpoint.parse(jServer.getString("ipv4AddrIn") + ":" + jServer.getString("port")) peerBuilder.setPublicKey(Key.fromBase64(peerConfig["PublicKey"]))
peerBuilder.setEndpoint(ep) peerConfig["PresharedKey"]?.let {
peerBuilder.setPublicKey(Key.fromBase64(jServer.getString("publicKey"))) peerBuilder.setPreSharedKey(Key.fromBase64(it))
}
val jAllowedIPList = obj.getJSONArray("allowedIPs") val allowedIPList = peerConfig["AllowedIPs"]?.split(",") ?: emptyList()
if (jAllowedIPList.length() == 0) { if (allowedIPList.isEmpty()) {
val internet = InetNetwork.parse("0.0.0.0/0") // aka The whole internet. val internet = InetNetwork.parse("0.0.0.0/0") // aka The whole internet.
peerBuilder.addAllowedIp(internet) peerBuilder.addAllowedIp(internet)
} else { } else {
(0 until jAllowedIPList.length()).toList().forEach { allowedIPList.forEach {
val network = InetNetwork.parse(jAllowedIPList.getString(it)) val network = InetNetwork.parse(it.trim())
peerBuilder.addAllowedIp(network) peerBuilder.addAllowedIp(network)
} }
} }
peerBuilder.setEndpoint(InetEndpoint.parse(peerConfig["Endpoint"]))
peerConfig["PersistentKeepalive"]?.let {
peerBuilder.setPersistentKeepalive(it.toInt())
}
confBuilder.addPeer(peerBuilder.build()) confBuilder.addPeer(peerBuilder.build())
val privateKey = obj.getJSONObject("keys").getString("privateKey")
val jDevice = obj.getJSONObject("device")
val ifaceBuilder = Interface.Builder() val ifaceBuilder = Interface.Builder()
ifaceBuilder.parsePrivateKey(privateKey) val ifaceConfig = config["Interface"]!!
ifaceBuilder.addAddress(InetNetwork.parse(jDevice.getString("ipv4Address"))) ifaceBuilder.parsePrivateKey(ifaceConfig["PrivateKey"])
ifaceBuilder.addAddress(InetNetwork.parse(jDevice.getString("ipv6Address"))) ifaceBuilder.addAddress(InetNetwork.parse(ifaceConfig["Address"]))
ifaceBuilder.addDnsServer(InetNetwork.parse(obj.getString("dns")).address) ifaceConfig["DNS"]!!.split(",").forEach {
val jExcludedApplication = obj.getJSONArray("excludedApps") ifaceBuilder.addDnsServer(InetNetwork.parse(it.trim()).address)
}
/*val jExcludedApplication = obj.getJSONArray("excludedApps")
(0 until jExcludedApplication.length()).toList().forEach { (0 until jExcludedApplication.length()).toList().forEach {
val appName = jExcludedApplication.get(it).toString() val appName = jExcludedApplication.get(it).toString()
ifaceBuilder.excludeApplication(appName) ifaceBuilder.excludeApplication(appName)
} }*/
confBuilder.setInterface(ifaceBuilder.build()) confBuilder.setInterface(ifaceBuilder.build())
return confBuilder.build() return confBuilder.build()
} }