ProtocolApi refactoring, move network classes to NetworkUtils.kt
This commit is contained in:
parent
8ec105bee0
commit
9738ada946
13 changed files with 213 additions and 122 deletions
|
|
@ -4,13 +4,17 @@ import android.content.Context
|
|||
import android.net.VpnService.Builder
|
||||
import java.util.TreeMap
|
||||
import com.wireguard.android.backend.GoBackend
|
||||
import org.amnezia.vpn.protocol.InetEndpoint
|
||||
import org.amnezia.vpn.protocol.InetNetwork
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import org.amnezia.vpn.protocol.Protocol
|
||||
import org.amnezia.vpn.protocol.ProtocolState
|
||||
import org.amnezia.vpn.protocol.ProtocolState.CONNECTED
|
||||
import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED
|
||||
import org.amnezia.vpn.protocol.Statistics
|
||||
import org.amnezia.vpn.protocol.VpnStartException
|
||||
import org.amnezia.vpn.protocol.parseInetAddress
|
||||
import org.amnezia.vpn.util.InetEndpoint
|
||||
import org.amnezia.vpn.util.InetNetwork
|
||||
import org.amnezia.vpn.util.Log
|
||||
import org.amnezia.vpn.util.parseInetAddress
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
|
|
@ -74,39 +78,38 @@ open class Wireguard : Protocol() {
|
|||
}
|
||||
}
|
||||
|
||||
override fun initialize(context: Context) {
|
||||
override fun initialize(context: Context, state: MutableStateFlow<ProtocolState>) {
|
||||
super.initialize(context, state)
|
||||
loadSharedLibrary(context, "wg-go")
|
||||
}
|
||||
|
||||
override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) {
|
||||
val wireguardConfig = parseConfig(config)
|
||||
start(wireguardConfig, vpnBuilder, protect)
|
||||
state.value = CONNECTED
|
||||
}
|
||||
|
||||
protected open fun parseConfig(config: JSONObject): WireguardConfig {
|
||||
val configDataJson = config.getJSONObject("wireguard_config_data")
|
||||
val configData = parseConfigData(configDataJson.getString("config"))
|
||||
return WireguardConfig.build(wireguardConfigBuilder(configData))
|
||||
return WireguardConfig.build { configWireguard(configData) }
|
||||
}
|
||||
|
||||
protected fun wireguardConfigBuilder(configData: Map<String, String>): WireguardConfig.Builder.() -> Unit =
|
||||
{
|
||||
configureBaseProtocol(true) {
|
||||
configData["Address"]?.let { addAddress(InetNetwork.parse(it)) }
|
||||
configData["DNS"]?.split(",")?.map { dns ->
|
||||
parseInetAddress(dns.trim())
|
||||
}?.forEach(::addDnsServer)
|
||||
configData["AllowedIPs"]?.split(",")?.map { route ->
|
||||
InetNetwork.parse(route.trim())
|
||||
}?.forEach(::addRoute)
|
||||
setMtu(configData["MTU"]?.toInt() ?: WIREGUARD_DEFAULT_MTU)
|
||||
}
|
||||
configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) }
|
||||
configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) }
|
||||
configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) }
|
||||
configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) }
|
||||
configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) }
|
||||
}
|
||||
protected fun WireguardConfig.Builder.configWireguard(configData: Map<String, String>) {
|
||||
configData["Address"]?.let { addAddress(InetNetwork.parse(it)) }
|
||||
configData["DNS"]?.split(",")?.map { dns ->
|
||||
parseInetAddress(dns.trim())
|
||||
}?.forEach(::addDnsServer)
|
||||
configData["AllowedIPs"]?.split(",")?.map { route ->
|
||||
InetNetwork.parse(route.trim())
|
||||
}?.forEach(::addRoute)
|
||||
configData["MTU"]?.let { setMtu(it.toInt()) }
|
||||
configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) }
|
||||
configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) }
|
||||
configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) }
|
||||
configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) }
|
||||
configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) }
|
||||
}
|
||||
|
||||
protected fun parseConfigData(data: String): Map<String, String> {
|
||||
val parsedData = TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)
|
||||
|
|
@ -155,5 +158,6 @@ open class Wireguard : Protocol() {
|
|||
val handleToClose = tunnelHandle
|
||||
tunnelHandle = -1
|
||||
GoBackend.wgTurnOff(handleToClose)
|
||||
state.value = DISCONNECTED
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
package org.amnezia.vpn.protocol.wireguard
|
||||
|
||||
import android.util.Base64
|
||||
import org.amnezia.vpn.protocol.InetEndpoint
|
||||
import org.amnezia.vpn.protocol.ProtocolConfig
|
||||
import org.amnezia.vpn.util.InetEndpoint
|
||||
|
||||
internal const val WIREGUARD_DEFAULT_MTU = 1280
|
||||
private const val WIREGUARD_DEFAULT_MTU = 1280
|
||||
|
||||
open class WireguardConfig protected constructor(
|
||||
protocolConfigBuilder: ProtocolConfig.Builder,
|
||||
|
|
@ -16,7 +16,7 @@ open class WireguardConfig protected constructor(
|
|||
) : ProtocolConfig(protocolConfigBuilder) {
|
||||
|
||||
protected constructor(builder: Builder) : this(
|
||||
builder.protocolConfigBuilder,
|
||||
builder,
|
||||
builder.endpoint,
|
||||
builder.persistentKeepalive,
|
||||
builder.publicKeyHex,
|
||||
|
|
@ -38,10 +38,7 @@ open class WireguardConfig protected constructor(
|
|||
return this.toString()
|
||||
}
|
||||
|
||||
class Builder {
|
||||
internal lateinit var protocolConfigBuilder: ProtocolConfig.Builder
|
||||
private set
|
||||
|
||||
open class Builder : ProtocolConfig.Builder(true) {
|
||||
internal lateinit var endpoint: InetEndpoint
|
||||
private set
|
||||
|
||||
|
|
@ -57,9 +54,7 @@ open class WireguardConfig protected constructor(
|
|||
internal lateinit var privateKeyHex: String
|
||||
private set
|
||||
|
||||
fun configureBaseProtocol(blockingMode: Boolean, block: ProtocolConfig.Builder.() -> Unit) = apply {
|
||||
protocolConfigBuilder = ProtocolConfig.Builder(blockingMode).apply(block)
|
||||
}
|
||||
override var mtu: Int = WIREGUARD_DEFAULT_MTU
|
||||
|
||||
fun setEndpoint(endpoint: InetEndpoint) = apply { this.endpoint = endpoint }
|
||||
|
||||
|
|
@ -71,7 +66,7 @@ open class WireguardConfig protected constructor(
|
|||
|
||||
fun setPrivateKeyHex(privateKeyHex: String) = apply { this.privateKeyHex = privateKeyHex }
|
||||
|
||||
fun build(): WireguardConfig = WireguardConfig(this)
|
||||
override fun build(): WireguardConfig = WireguardConfig(this)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue