Fix wireguard config
This commit is contained in:
parent
421f665e85
commit
4de38a295c
1 changed files with 65 additions and 39 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue