From 74ae4f3e673bdc3b8b34d9f7d98b686a1f5895ef Mon Sep 17 00:00:00 2001 From: albexk Date: Sat, 6 Jul 2024 18:44:34 +0300 Subject: [PATCH] SSXray for Android (#885) --- CMakeLists.txt | 4 ++-- client/android/src/org/amnezia/vpn/AmneziaActivity.kt | 3 ++- client/android/src/org/amnezia/vpn/VpnProto.kt | 10 +++++++++- client/android/xray/src/main/kotlin/Xray.kt | 9 ++++++++- client/containers/containers_defs.cpp | 1 + 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dbf778d..6434eb12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.6.0.1 +project(${PROJECT} VERSION 4.6.0.3 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) @@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) -set(APP_ANDROID_VERSION_CODE 54) +set(APP_ANDROID_VERSION_CODE 55) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index 202fe2e6..e3ed6d39 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -384,7 +384,8 @@ class AmneziaActivity : QtActivity() { getVpnProto(vpnConfig)?.let { proto -> Log.d(TAG, "Proto from config: $proto, current proto: $vpnProto") if (isServiceConnected) { - if (proto == vpnProto) { + if (proto.serviceClass == vpnProto?.serviceClass) { + vpnProto = proto connectToVpn(vpnConfig) return } diff --git a/client/android/src/org/amnezia/vpn/VpnProto.kt b/client/android/src/org/amnezia/vpn/VpnProto.kt index 508ce226..658e06ac 100644 --- a/client/android/src/org/amnezia/vpn/VpnProto.kt +++ b/client/android/src/org/amnezia/vpn/VpnProto.kt @@ -49,7 +49,15 @@ enum class VpnProto( "org.amnezia.vpn:amneziaXrayService", XrayService::class.java ) { - override fun createProtocol(): Protocol = Xray() + override fun createProtocol(): Protocol = Xray.instance + }, + + SSXRAY( + "SSXRay", + "org.amnezia.vpn:amneziaXrayService", + XrayService::class.java + ) { + override fun createProtocol(): Protocol = Xray.instance }; private var _protocol: Protocol? = null diff --git a/client/android/xray/src/main/kotlin/Xray.kt b/client/android/xray/src/main/kotlin/Xray.kt index 7d16d3a0..3e5f9f7c 100644 --- a/client/android/xray/src/main/kotlin/Xray.kt +++ b/client/android/xray/src/main/kotlin/Xray.kt @@ -5,6 +5,7 @@ import android.net.VpnService.Builder import java.io.File import java.io.IOException import go.Seq +import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.ProtocolState.CONNECTED import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED @@ -114,7 +115,9 @@ class Xray : Protocol() { return } - val xrayJsonConfig = config.getJSONObject("xray_config_data") + val xrayJsonConfig = config.optJSONObject("xray_config_data") + ?: config.optJSONObject("ssxray_config_data") + ?: throw BadConfigException("config_data not found") val xrayConfig = parseConfig(config, xrayJsonConfig) (xrayJsonConfig.optJSONObject("log") ?: JSONObject().also { xrayJsonConfig.put("log", it) }) @@ -223,6 +226,10 @@ class Xray : Protocol() { throw VpnStartException("Failed to start tun2socks: $err") } } + + companion object { + val instance: Xray by lazy { Xray() } + } } private fun String?.isNotNullOrBlank(block: (String) -> Unit) { diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index bb6f3a40..91acd63b 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -306,6 +306,7 @@ bool ContainerProps::isSupportedByCurrentPlatform(DockerContainer c) case DockerContainer::Awg: return true; case DockerContainer::Cloak: return true; case DockerContainer::Xray: return true; + case DockerContainer::SSXray: return true; default: return false; }