Add onError callback to handle errors in protocol threads

This commit is contained in:
albexk 2023-12-05 13:47:12 +03:00
parent 5c3e253067
commit 5835a756ce
5 changed files with 28 additions and 27 deletions

View file

@ -11,8 +11,8 @@ import net.openvpn.ovpn3.ClientAPI_Config
import org.amnezia.vpn.protocol.BadConfigException
import org.amnezia.vpn.protocol.Protocol
import org.amnezia.vpn.protocol.ProtocolState
import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED
import org.amnezia.vpn.protocol.Statistics
import org.amnezia.vpn.protocol.VpnException
import org.amnezia.vpn.protocol.VpnStartException
import org.amnezia.vpn.util.net.InetNetwork
import org.amnezia.vpn.util.net.getLocalNetworks
@ -53,8 +53,8 @@ open class OpenVpn : Protocol() {
return Statistics.EMPTY_STATISTICS
}
override fun initialize(context: Context, state: MutableStateFlow<ProtocolState>) {
super.initialize(context, state)
override fun initialize(context: Context, state: MutableStateFlow<ProtocolState>, onError: (String) -> Unit) {
super.initialize(context, state, onError)
loadSharedLibrary(context, "ovpn3")
this.context = context
scope = CoroutineScope(Dispatchers.IO)
@ -64,11 +64,12 @@ open class OpenVpn : Protocol() {
val configBuilder = OpenVpnConfig.Builder()
openVpnClient = OpenVpnClient(
configBuilder,
state,
{ ipv6 -> getLocalNetworks(context, ipv6) },
makeEstablish(configBuilder, vpnBuilder),
protect
configBuilder = configBuilder,
state = state,
getLocalNetworks = { ipv6 -> getLocalNetworks(context, ipv6) },
establish = makeEstablish(configBuilder, vpnBuilder),
protect = protect,
onError = onError
)
try {
@ -92,7 +93,8 @@ open class OpenVpn : Protocol() {
scope.launch {
val status = client.connect()
if (status.error) {
throw VpnException("OpenVpn connect() error: ${status.status}: ${status.message}")
state.value = DISCONNECTED
onError("OpenVpn connect() error: ${status.status}: ${status.message}")
}
}
}

View file

@ -14,7 +14,6 @@ import net.openvpn.ovpn3.ClientAPI_TransportStats
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.VpnStartException
import org.amnezia.vpn.util.Log
import org.amnezia.vpn.util.net.InetNetwork
import org.amnezia.vpn.util.net.parseInetAddress
@ -27,7 +26,8 @@ class OpenVpnClient(
private val state: MutableStateFlow<ProtocolState>,
private val getLocalNetworks: (Boolean) -> List<InetNetwork>,
private val establish: () -> Int,
private val protect: (Int) -> Boolean
private val protect: (Int) -> Boolean,
private val onError: (String) -> Unit
) : ClientAPI_OpenVPNClient() {
/**************************************************************************
@ -368,15 +368,11 @@ class OpenVpnClient(
"COMPRESSION_ENABLED", "WARN" -> Log.w(TAG, "$name: $info")
"CONNECTED" -> state.value = CONNECTED
"DISCONNECTED" -> state.value = DISCONNECTED
"CONNECTION_TIMEOUT" -> {
Log.w(TAG, "$name: $info")
state.value = DISCONNECTED
// todo: test it
throw VpnStartException("Connection timeout")
}
}
if (event.error) Log.e(TAG, "OpenVpn ERROR: $name: $info")
if (event.fatal) Log.e(TAG, "OpenVpn FATAL: $name: $info")
if (event.error || event.fatal) {
state.value = DISCONNECTED
onError("OpenVpn ${if (event.error) "ERROR" else "FATAL"}: $name: $info")
}
}
// Callback for logging.