fix: prevent crash from bad file config upload and bug preventing vpn from starting via watcher service after reboot

Add catch for file configs that are malformed and display message to the user

Pass full tunnel config to watcher service after detecting reboot to allow watcher service to start tunnel properly.
This commit is contained in:
Zane Schepke 2023-07-05 23:21:55 -04:00
parent cb3a7d024b
commit a98a47f54d
6 changed files with 29 additions and 11 deletions

View File

@ -17,7 +17,7 @@ android {
val versionMajor = 2 val versionMajor = 2
val versionMinor = 0 val versionMinor = 0
val versionPatch = 1 val versionPatch = 2
val versionBuild = 0 val versionBuild = 0
defaultConfig { defaultConfig {

View File

@ -36,7 +36,7 @@ class BootReceiver : BroadcastReceiver() {
Action.START, context, Action.START, context,
WireGuardConnectivityWatcherService::class.java, WireGuardConnectivityWatcherService::class.java,
mapOf(context.resources.getString(R.string.tunnel_extras_key) to mapOf(context.resources.getString(R.string.tunnel_extras_key) to
defaultTunnel.id.toString()) defaultTunnel.toString())
) )
} }
} }

View File

@ -6,8 +6,8 @@ import android.app.Service
import android.content.Context import android.content.Context
import android.content.Context.ACTIVITY_SERVICE import android.content.Context.ACTIVITY_SERVICE
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import com.google.firebase.crashlytics.ktx.crashlytics
import com.zaneschepke.wireguardautotunnel.R import com.google.firebase.ktx.Firebase
object ServiceTracker { object ServiceTracker {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@ -31,7 +31,11 @@ object ServiceTracker {
} }
} }
intent.component?.javaClass intent.component?.javaClass
application.startService(intent) try {
application.startService(intent)
} catch (e : Exception) {
e.message?.let { Firebase.crashlytics.log(it) }
}
} }
fun <T : Service> actionOnService(action: Action, context: Context, cls : Class<T>, extras : Map<String,String>? = null) { fun <T : Service> actionOnService(action: Action, context: Context, cls : Class<T>, extras : Map<String,String>? = null) {
@ -43,6 +47,10 @@ object ServiceTracker {
} }
} }
intent.component?.javaClass intent.component?.javaClass
context.startService(intent) try {
context.startService(intent)
} catch (e : Exception) {
e.message?.let { Firebase.crashlytics.log(it) }
}
} }
} }

View File

@ -161,6 +161,7 @@ class WireGuardConnectivityWatcherService : ForegroundService() {
if(!isWifiConnected && vpnService.getState() == Tunnel.State.UP) stopVPN() if(!isWifiConnected && vpnService.getState() == Tunnel.State.UP) stopVPN()
Timber.d("Lost mobile data connection") Timber.d("Lost mobile data connection")
} }
else -> {}
} }
} }
} }
@ -200,6 +201,7 @@ class WireGuardConnectivityWatcherService : ForegroundService() {
startVPN() startVPN()
} }
} }
else -> {}
} }
} }
} }

View File

@ -7,6 +7,7 @@ import android.net.Uri
import android.provider.OpenableColumns import android.provider.OpenableColumns
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.wireguard.config.BadConfigException
import com.wireguard.config.Config import com.wireguard.config.Config
import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.repository.Repository import com.zaneschepke.wireguardautotunnel.repository.Repository
@ -122,12 +123,18 @@ class MainViewModel @Inject constructor(private val application : Application,
val stream = application.applicationContext.contentResolver.openInputStream(uri) val stream = application.applicationContext.contentResolver.openInputStream(uri)
stream ?: return stream ?: return
val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8) val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8)
val config = Config.parse(bufferReader) try {
val tunnelName = getNameFromFileName(fileName) val config = Config.parse(bufferReader)
viewModelScope.launch { val tunnelName = getNameFromFileName(fileName)
tunnelRepo.save(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString())) viewModelScope.launch {
tunnelRepo.save(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString()))
}
stream.close()
} catch(_: BadConfigException) {
viewModelScope.launch {
showSnackBarMessage(application.applicationContext.getString(R.string.bad_config))
}
} }
stream.close()
} }
@SuppressLint("Range") @SuppressLint("Range")

View File

@ -57,4 +57,5 @@
<string name="no_thanks">No thanks</string> <string name="no_thanks">No thanks</string>
<string name="turn_on">Turn on</string> <string name="turn_on">Turn on</string>
<string name="map">Map</string> <string name="map">Map</string>
<string name="bad_config">Bad config. Please try again.</string>
</resources> </resources>