Add error handling of enabled "always-on" during VPN connection (#698)
* Always add awg-go version to the log * Display an error message always when no vpn permission is granted
This commit is contained in:
parent
30bd264f17
commit
7730dd510c
8 changed files with 67 additions and 16 deletions
|
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
|
||||||
|
|
||||||
set(PROJECT AmneziaVPN)
|
set(PROJECT AmneziaVPN)
|
||||||
|
|
||||||
project(${PROJECT} VERSION 4.4.2.1
|
project(${PROJECT} VERSION 4.4.2.2
|
||||||
DESCRIPTION "AmneziaVPN"
|
DESCRIPTION "AmneziaVPN"
|
||||||
HOMEPAGE_URL "https://amnezia.org/"
|
HOMEPAGE_URL "https://amnezia.org/"
|
||||||
)
|
)
|
||||||
|
@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d")
|
||||||
set(RELEASE_DATE "${CURRENT_DATE}")
|
set(RELEASE_DATE "${CURRENT_DATE}")
|
||||||
|
|
||||||
set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
|
set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
|
||||||
set(APP_ANDROID_VERSION_CODE 49)
|
set(APP_ANDROID_VERSION_CODE 50)
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
set(MZ_PLATFORM_NAME "linux")
|
set(MZ_PLATFORM_NAME "linux")
|
||||||
|
|
|
@ -2,4 +2,11 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="connecting">Подключение</string>
|
<string name="connecting">Подключение</string>
|
||||||
<string name="disconnecting">Отключение</string>
|
<string name="disconnecting">Отключение</string>
|
||||||
|
<string name="cancel">Отмена</string>
|
||||||
|
<string name="ok">ОК</string>
|
||||||
|
<string name="vpnGranted">VPN-подключение разрешено</string>
|
||||||
|
<string name="vpnDenied">VPN-подключение запрещено</string>
|
||||||
|
<string name="vpnSetupFailed">Ошибка настройки VPN</string>
|
||||||
|
<string name="vpnSetupFailedMessage">Чтобы подключиться к AmneziaVPN необходимо:\n\n- Разрешить приложению подключаться к сети VPN\n- Отключить функцию \"Постоянная VPN\" для всех остальных VPN-приложений в системных настройках VPN</string>
|
||||||
|
<string name="openVpnSettings">Открыть настройки VPN</string>
|
||||||
</resources>
|
</resources>
|
|
@ -2,4 +2,11 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="connecting">Connecting</string>
|
<string name="connecting">Connecting</string>
|
||||||
<string name="disconnecting">Disconnecting</string>
|
<string name="disconnecting">Disconnecting</string>
|
||||||
|
<string name="cancel">Cancel</string>
|
||||||
|
<string name="ok">OK</string>
|
||||||
|
<string name="vpnGranted">VPN permission granted</string>
|
||||||
|
<string name="vpnDenied">VPN permission denied</string>
|
||||||
|
<string name="vpnSetupFailed">VPN setup error</string>
|
||||||
|
<string name="vpnSetupFailedMessage">To connect to AmneziaVPN, please do the following:\n\n- Allow the app to set up a VPN connection\n- Disable Always-on VPN for any other VPN app in the VPN system settings</string>
|
||||||
|
<string name="openVpnSettings">Open VPN settings</string>
|
||||||
</resources>
|
</resources>
|
|
@ -1,5 +1,6 @@
|
||||||
package org.amnezia.vpn
|
package org.amnezia.vpn
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.Intent.EXTRA_MIME_TYPES
|
import android.content.Intent.EXTRA_MIME_TYPES
|
||||||
|
@ -14,6 +15,7 @@ import android.os.IBinder
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.os.Message
|
import android.os.Message
|
||||||
import android.os.Messenger
|
import android.os.Messenger
|
||||||
|
import android.provider.Settings
|
||||||
import android.view.WindowManager.LayoutParams
|
import android.view.WindowManager.LayoutParams
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
@ -216,13 +218,13 @@ class AmneziaActivity : QtActivity() {
|
||||||
when (resultCode) {
|
when (resultCode) {
|
||||||
RESULT_OK -> {
|
RESULT_OK -> {
|
||||||
Log.d(TAG, "Vpn permission granted")
|
Log.d(TAG, "Vpn permission granted")
|
||||||
Toast.makeText(this, "Vpn permission granted", Toast.LENGTH_LONG).show()
|
Toast.makeText(this, resources.getText(R.string.vpnGranted), Toast.LENGTH_LONG).show()
|
||||||
checkVpnPermissionCallbacks?.run { onSuccess() }
|
checkVpnPermissionCallbacks?.run { onSuccess() }
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
Log.w(TAG, "Vpn permission denied, resultCode: $resultCode")
|
Log.w(TAG, "Vpn permission denied, resultCode: $resultCode")
|
||||||
Toast.makeText(this, "Vpn permission denied", Toast.LENGTH_LONG).show()
|
showOnVpnPermissionRejectDialog()
|
||||||
checkVpnPermissionCallbacks?.run { onFail() }
|
checkVpnPermissionCallbacks?.run { onFail() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,6 +282,17 @@ class AmneziaActivity : QtActivity() {
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showOnVpnPermissionRejectDialog() {
|
||||||
|
AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.vpnSetupFailed)
|
||||||
|
.setMessage(R.string.vpnSetupFailedMessage)
|
||||||
|
.setNegativeButton(R.string.ok) { _, _ -> }
|
||||||
|
.setPositiveButton(R.string.openVpnSettings) { _, _ ->
|
||||||
|
startActivity(Intent(Settings.ACTION_VPN_SETTINGS))
|
||||||
|
}
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
@MainThread
|
@MainThread
|
||||||
private fun startVpn(vpnConfig: String) {
|
private fun startVpn(vpnConfig: String) {
|
||||||
if (isServiceConnected) {
|
if (isServiceConnected) {
|
||||||
|
|
|
@ -215,11 +215,9 @@ class AmneziaVpnService : VpnService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
val isAlwaysOnCompat =
|
val isAlwaysOn = intent != null && intent.action == SERVICE_INTERFACE
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) isAlwaysOn
|
|
||||||
else intent?.component?.packageName != packageName
|
|
||||||
|
|
||||||
if (isAlwaysOnCompat) {
|
if (isAlwaysOn) {
|
||||||
Log.d(TAG, "Start service via Always-on")
|
Log.d(TAG, "Start service via Always-on")
|
||||||
connect()
|
connect()
|
||||||
} else if (intent?.getBooleanExtra(AFTER_PERMISSION_CHECK, false) == true) {
|
} else if (intent?.getBooleanExtra(AFTER_PERMISSION_CHECK, false) == true) {
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
package org.amnezia.vpn
|
package org.amnezia.vpn
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
import android.app.KeyguardManager
|
import android.app.KeyguardManager
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
|
import android.content.res.Configuration.UI_MODE_NIGHT_MASK
|
||||||
|
import android.content.res.Configuration.UI_MODE_NIGHT_YES
|
||||||
import android.net.VpnService
|
import android.net.VpnService
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.provider.Settings
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.result.ActivityResult
|
import androidx.activity.result.ActivityResult
|
||||||
|
@ -52,19 +56,43 @@ class VpnRequestActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkRequestResult(result: ActivityResult) {
|
private fun checkRequestResult(result: ActivityResult) {
|
||||||
when (result.resultCode) {
|
when (val resultCode = result.resultCode) {
|
||||||
RESULT_OK -> onPermissionGranted()
|
RESULT_OK -> {
|
||||||
else -> Toast.makeText(this, "Vpn permission denied", Toast.LENGTH_LONG).show()
|
onPermissionGranted()
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
Log.w(TAG, "Vpn permission denied, resultCode: $resultCode")
|
||||||
|
showOnVpnPermissionRejectDialog()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
finish()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onPermissionGranted() {
|
private fun onPermissionGranted() {
|
||||||
Toast.makeText(this, "Vpn permission granted", Toast.LENGTH_LONG).show()
|
Toast.makeText(this, resources.getString(R.string.vpnGranted), Toast.LENGTH_LONG).show()
|
||||||
Intent(applicationContext, AmneziaVpnService::class.java).apply {
|
Intent(applicationContext, AmneziaVpnService::class.java).apply {
|
||||||
putExtra(AFTER_PERMISSION_CHECK, true)
|
putExtra(AFTER_PERMISSION_CHECK, true)
|
||||||
}.also {
|
}.also {
|
||||||
ContextCompat.startForegroundService(this, it)
|
ContextCompat.startForegroundService(this, it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showOnVpnPermissionRejectDialog() {
|
||||||
|
AlertDialog.Builder(this, getDialogTheme())
|
||||||
|
.setTitle(R.string.vpnSetupFailed)
|
||||||
|
.setMessage(R.string.vpnSetupFailedMessage)
|
||||||
|
.setNegativeButton(R.string.ok) { _, _ -> }
|
||||||
|
.setPositiveButton(R.string.openVpnSettings) { _, _ ->
|
||||||
|
startActivity(Intent(Settings.ACTION_VPN_SETTINGS))
|
||||||
|
}
|
||||||
|
.setOnDismissListener { finish() }
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDialogTheme(): Int =
|
||||||
|
if (resources.configuration.uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES)
|
||||||
|
android.R.style.Theme_DeviceDefault_Dialog_Alert
|
||||||
|
else
|
||||||
|
android.R.style.Theme_DeviceDefault_Light_Dialog_Alert
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ open class Wireguard : Protocol() {
|
||||||
if (tunFd == null) {
|
if (tunFd == null) {
|
||||||
throw VpnStartException("Create VPN interface: permission not granted or revoked")
|
throw VpnStartException("Create VPN interface: permission not granted or revoked")
|
||||||
}
|
}
|
||||||
Log.v(TAG, "Wg-go backend ${GoBackend.awgVersion()}")
|
Log.i(TAG, "awg-go backend ${GoBackend.awgVersion()}")
|
||||||
tunnelHandle = GoBackend.awgTurnOn(ifName, tunFd.detachFd(), config.toWgUserspaceString())
|
tunnelHandle = GoBackend.awgTurnOn(ifName, tunFd.detachFd(), config.toWgUserspaceString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,7 @@ set(SOURCES ${SOURCES}
|
||||||
|
|
||||||
foreach(abi IN ITEMS ${QT_ANDROID_ABIS})
|
foreach(abi IN ITEMS ${QT_ANDROID_ABIS})
|
||||||
set_property(TARGET ${PROJECT} PROPERTY QT_ANDROID_EXTRA_LIBS
|
set_property(TARGET ${PROJECT} PROPERTY QT_ANDROID_EXTRA_LIBS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg.so
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg-go.so
|
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg-go.so
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg-quick.so
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libck-ovpn-plugin.so
|
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libck-ovpn-plugin.so
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libovpn3.so
|
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libovpn3.so
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libovpnutil.so
|
${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/android/${abi}/libovpnutil.so
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue