From 05b950fbb3769f2eeb4d383aff1a091915d88ef7 Mon Sep 17 00:00:00 2001 From: Patryk <43276401+Zaptyp@users.noreply.github.com> Date: Thu, 18 Dec 2025 16:25:31 +0100 Subject: [PATCH] fix: add check if kernel supports WG (#993) --- .../core/tunnel/KernelTunnel.kt | 3 +++ .../domain/events/BackendCoreException.kt | 4 ++++ .../viewmodel/SharedAppViewModel.kt | 16 +++++++++++++++- app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt index 1b369089..b5fdf78c 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt @@ -2,6 +2,7 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel import com.wireguard.android.backend.Backend import com.wireguard.android.backend.BackendException +import com.wireguard.android.backend.WgQuickBackend import com.wireguard.android.backend.Tunnel as WgTunnel import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.di.ApplicationScope @@ -9,6 +10,7 @@ import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.di.Kernel import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.events.KernelWireguardNotSupported import com.zaneschepke.wireguardautotunnel.domain.events.DnsFailure import com.zaneschepke.wireguardautotunnel.domain.events.InvalidConfig import com.zaneschepke.wireguardautotunnel.domain.events.KernelTunnelName @@ -55,6 +57,7 @@ constructor( } override fun tunnelStateFlow(tunnelConfig: TunnelConfig): Flow = callbackFlow { + if (!WgQuickBackend.hasKernelSupport()) close(KernelWireguardNotSupported()) validateWireGuardInterfaceName(tunnelConfig.name).onFailure { close(it) } val stateChannel = Channel() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/BackendCoreException.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/BackendCoreException.kt index c2a6f800..0d878431 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/BackendCoreException.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/BackendCoreException.kt @@ -40,3 +40,7 @@ class UnknownError : BackendCoreException() { class UapiUpdateFailed : BackendCoreException() { override val stringRes = R.string.active_tunnel_update_failed } + +class KernelWireguardNotSupported : BackendCoreException() { + override val stringRes = R.string.kernel_wireguard_unsupported +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt index 414cc9f5..2e293807 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt @@ -3,7 +3,7 @@ package com.zaneschepke.wireguardautotunnel.viewmodel import android.net.Uri import androidx.core.net.toUri import androidx.lifecycle.ViewModel -import com.zaneschepke.wireguardautotunnel.R +import com.wireguard.android.backend.WgQuickBackend import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager import com.zaneschepke.wireguardautotunnel.data.model.AppMode @@ -34,6 +34,7 @@ import kotlinx.coroutines.flow.map import org.amnezia.awg.config.BadConfigException import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container +import timber.log.Timber import xyz.teamgravity.pin_lock_compose.PinManager @HiltViewModel @@ -164,6 +165,19 @@ constructor( else StringValue.StringResource(R.string.root_accepted) postSideEffect(GlobalSideEffect.Snackbar(message)) if (!accepted) return@intent + if (WgQuickBackend.hasKernelSupport()) + Timber.i("Device supports kernel backend. WireGuard module is built in, switching to kernel backend.") + else { + Timber.e("Device does not support kernel backend!") + intent { + postSideEffect( + GlobalSideEffect.Snackbar( + StringValue.StringResource(R.string.kernel_wireguard_unsupported) + ) + ) + } + return@intent + } } } settingsRepository.upsert(state.settings.copy(appMode = appMode)) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 68f8a12d..42eeefdc 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -324,5 +324,6 @@ Moim marzeniem jest praca nad tym projektem na pełen etat. Z wdzięcznością, Niestety, ze względu na politykę Google, linki do darowizn nie są dozwolone w wersji tej aplikacji dostępnej w Google Play. Aby dowiedzieć się, gdzie można przekazać darowiznę, odwiedź strony projektu. + Kernel nie zawiera wsparcia dla WireGuard (brak modułu albo nie wbudowany w kernel)! Nie można usunąć aktywnego tunelu. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c62a14de..20f31585 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -377,6 +377,7 @@ Cannot delete active tunnel. Back Configuration + Kernel does not include WireGuard support (module missing or not built-in into kernel)! About Resources App website