From d62ade58a511aa76f8944b7cf32bc646a644b68c Mon Sep 17 00:00:00 2001 From: lunardunno <126363523+lunardunno@users.noreply.github.com> Date: Mon, 27 May 2024 12:05:53 +0400 Subject: [PATCH 1/7] update Hindi translation Fixed handling of file extensions in Hindi translation. --- client/translations/amneziavpn_hi_IN.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/translations/amneziavpn_hi_IN.ts b/client/translations/amneziavpn_hi_IN.ts index 802604a6..2c718fb7 100644 --- a/client/translations/amneziavpn_hi_IN.ts +++ b/client/translations/amneziavpn_hi_IN.ts @@ -1144,7 +1144,7 @@ Already installed containers were found on the server. All installed containers Executable file (*.*) - निष्पादनीय फाइल (*।*) + निष्पादनीय फाइल (*.*) @@ -1276,7 +1276,7 @@ Already installed containers were found on the server. All installed containers Backup files (*.backup) - बैकअप फ़ाइलें (*.बैकअप) + बैकअप फ़ाइलें (*.backup) @@ -1480,7 +1480,7 @@ Already installed containers were found on the server. All installed containers Logs files (*.log) - लॉग फ़ाइलें (*.लॉग) + लॉग फ़ाइलें (*.log) From aac9bfcea6744e13a3966b069a3a832d1794e9c6 Mon Sep 17 00:00:00 2001 From: Vladyslav Miachkov Date: Mon, 27 May 2024 18:58:36 +0300 Subject: [PATCH 2/7] Possible wg show crash fix --- client/ui/models/clientManagementModel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index ea5cb23c..f2117f75 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -281,7 +281,8 @@ ErrorCode ClientManagementModel::wgShow(const DockerContainer container, const S } }; - for (int i = 0; i < peerList.size() && i < transferredDataList.size(); ++i) { + for (int i = 0; i < peerList.size() && i < transferredDataList.size() && i < latestHandshakeList.size(); ++i) { + const auto transferredData = getStrValue(transferredDataList[i]).split(","); auto latestHandshake = getStrValue(latestHandshakeList[i]); auto serverBytesReceived = transferredData.front().trimmed(); From 5db0c281ee33bde55d7344cb52e202c25c609a5c Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 30 May 2024 12:42:53 +0200 Subject: [PATCH 3/7] fixed isDefaultServerDefaultContainerHasSplitTunneling() --- client/ui/models/servers_model.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 480ff3b4..17535e5a 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -615,15 +615,18 @@ bool ServersModel::isDefaultServerDefaultContainerHasSplitTunneling() { auto server = m_servers.at(m_defaultServerIndex).toObject(); auto defaultContainer = ContainerProps::containerFromString(server.value(config_key::defaultContainer).toString()); - auto containerConfig = server.value(config_key::containers).toArray().at(defaultContainer).toObject(); - auto protocolConfig = containerConfig.value(ContainerProps::containerTypeToString(defaultContainer)).toObject(); - if (defaultContainer == DockerContainer::Awg || defaultContainer == DockerContainer::WireGuard) { - return !(protocolConfig.value(config_key::last_config).toString().contains("AllowedIPs = 0.0.0.0/0, ::/0")); - } else if (defaultContainer == DockerContainer::Cloak || defaultContainer == DockerContainer::OpenVpn - || defaultContainer == DockerContainer::ShadowSocks) { - return !(protocolConfig.value(config_key::last_config).toString().contains("redirect-gateway")); + auto containers = server.value(config_key::containers).toArray(); + for (auto i = 0; i < containers.size(); i++) { + auto container = containers.at(i).toObject(); + if (defaultContainer == DockerContainer::Awg || defaultContainer == DockerContainer::WireGuard) { + auto containerConfig = container.value(ContainerProps::containerTypeToString(defaultContainer)).toObject(); + return !(containerConfig.value(config_key::last_config).toString().contains("AllowedIPs = 0.0.0.0/0, ::/0")); + } else if (defaultContainer == DockerContainer::Cloak || defaultContainer == DockerContainer::OpenVpn + || defaultContainer == DockerContainer::ShadowSocks) { + auto containerConfig = container.value(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)).toObject(); + return !(containerConfig.value(config_key::last_config).toString().contains("redirect-gateway")); + } } - return false; } From 04fb1825d52cd5135e62bcfacf5b323e03688303 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 5 Jun 2024 22:19:23 +0200 Subject: [PATCH 4/7] fixed display of awg config settings received from api --- client/core/controllers/apiController.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/client/core/controllers/apiController.cpp b/client/core/controllers/apiController.cpp index 1a8dc8eb..35b459be 100644 --- a/client/core/controllers/apiController.cpp +++ b/client/core/controllers/apiController.cpp @@ -40,6 +40,28 @@ void ApiController::processApiConfig(const QString &protocol, const ApiControlle return; } else if (protocol == configKey::awg) { config.replace("$WIREGUARD_CLIENT_PRIVATE_KEY", apiPayloadData.wireGuardClientPrivKey); + auto serverConfig = QJsonDocument::fromJson(config.toUtf8()).object(); + auto containers = serverConfig.value(config_key::containers).toArray(); + if (containers.isEmpty()) { + return; + } + auto container = containers.at(0).toObject(); + QString containerName = ContainerProps::containerTypeToString(DockerContainer::Awg); + auto containerConfig = container.value(containerName).toObject(); + auto protocolConfig = QJsonDocument::fromJson(containerConfig.value(config_key::last_config).toString().toUtf8()).object(); + containerConfig[config_key::junkPacketCount] = protocolConfig.value(config_key::junkPacketCount); + containerConfig[config_key::junkPacketMinSize] = protocolConfig.value(config_key::junkPacketMinSize); + containerConfig[config_key::junkPacketMaxSize] = protocolConfig.value(config_key::junkPacketMaxSize); + containerConfig[config_key::initPacketJunkSize] = protocolConfig.value(config_key::initPacketJunkSize); + containerConfig[config_key::responsePacketJunkSize] = protocolConfig.value(config_key::responsePacketJunkSize); + containerConfig[config_key::initPacketMagicHeader] = protocolConfig.value(config_key::initPacketMagicHeader); + containerConfig[config_key::responsePacketMagicHeader] = protocolConfig.value(config_key::responsePacketMagicHeader); + containerConfig[config_key::underloadPacketMagicHeader] = protocolConfig.value(config_key::underloadPacketMagicHeader); + containerConfig[config_key::transportPacketMagicHeader] = protocolConfig.value(config_key::transportPacketMagicHeader); + container[containerName] = containerConfig; + containers.replace(0, container); + serverConfig[config_key::containers] = containers; + config = QString(QJsonDocument(serverConfig).toJson()); } return; } From c22f9ff08af880d8d6020c8fe5001215e18228bc Mon Sep 17 00:00:00 2001 From: Nethius Date: Mon, 10 Jun 2024 18:35:24 +0700 Subject: [PATCH 5/7] added ui for proxy container (#762) Added proxy container --- client/amnezia_application.cpp | 3 + client/amnezia_application.h | 2 + client/containers/containers_defs.cpp | 14 +- client/containers/containers_defs.h | 3 +- client/core/controllers/serverController.cpp | 15 +- client/core/scripts_registry.cpp | 1 + client/protocols/protocols_defs.cpp | 9 +- client/protocols/protocols_defs.h | 12 +- client/resources.qrc | 7 +- client/server_scripts/socks5_proxy/Dockerfile | 10 + .../socks5_proxy/configure_container.sh | 12 + .../socks5_proxy/run_container.sh | 5 + client/server_scripts/socks5_proxy/start.sh | 7 + client/ui/controllers/installController.cpp | 23 +- client/ui/controllers/pageController.h | 1 + client/ui/models/protocols_model.cpp | 1 + client/ui/models/servers_model.cpp | 2 + .../services/socks5ProxyConfigModel.cpp | 80 ++++ .../models/services/socks5ProxyConfigModel.h | 40 ++ .../Pages2/PageServiceSocksProxySettings.qml | 385 ++++++++++++++++++ .../qml/Pages2/PageSettingsServerProtocol.qml | 7 +- .../PageSetupWizardProtocolSettings.qml | 5 + 22 files changed, 633 insertions(+), 11 deletions(-) create mode 100644 client/server_scripts/socks5_proxy/Dockerfile create mode 100644 client/server_scripts/socks5_proxy/configure_container.sh create mode 100644 client/server_scripts/socks5_proxy/run_container.sh create mode 100644 client/server_scripts/socks5_proxy/start.sh create mode 100644 client/ui/models/services/socks5ProxyConfigModel.cpp create mode 100644 client/ui/models/services/socks5ProxyConfigModel.h create mode 100644 client/ui/qml/Pages2/PageServiceSocksProxySettings.qml diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index db4061eb..eb1eab45 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -351,6 +351,9 @@ void AmneziaApplication::initModels() m_sftpConfigModel.reset(new SftpConfigModel(this)); m_engine->rootContext()->setContextProperty("SftpConfigModel", m_sftpConfigModel.get()); + m_socks5ConfigModel.reset(new Socks5ProxyConfigModel(this)); + m_engine->rootContext()->setContextProperty("Socks5ProxyConfigModel", m_socks5ConfigModel.get()); + m_clientManagementModel.reset(new ClientManagementModel(m_settings, this)); m_engine->rootContext()->setContextProperty("ClientManagementModel", m_clientManagementModel.get()); connect(m_clientManagementModel.get(), &ClientManagementModel::adminConfigRevoked, m_serversModel.get(), diff --git a/client/amnezia_application.h b/client/amnezia_application.h index 5561d7c7..b15d55d7 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -41,6 +41,7 @@ #include "ui/models/protocols_model.h" #include "ui/models/servers_model.h" #include "ui/models/services/sftpConfigModel.h" +#include "ui/models/services/socks5ProxyConfigModel.h" #include "ui/models/sites_model.h" #include "ui/models/clientManagementModel.h" #include "ui/models/appSplitTunnelingModel.h" @@ -114,6 +115,7 @@ private: #endif QScopedPointer m_sftpConfigModel; + QScopedPointer m_socks5ConfigModel; QSharedPointer m_vpnConnection; QThread m_vpnConnectionThread; diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index 89633f9e..3c2a3861 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -69,6 +69,8 @@ QVector ContainerProps::protocolsForContainer(amnezia::DockerCon case DockerContainer::Sftp: return { Proto::Sftp }; + case DockerContainer::Socks5Proxy: return { Proto::Socks5Proxy }; + default: return { defaultProtocol(container) }; } } @@ -98,7 +100,8 @@ QMap ContainerProps::containerHumanNames() { DockerContainer::TorWebSite, QObject::tr("Website in Tor network") }, { DockerContainer::Dns, QObject::tr("Amnezia DNS") }, - { DockerContainer::Sftp, QObject::tr("Sftp file sharing service") } }; + { DockerContainer::Sftp, QObject::tr("Sftp file sharing service") }, + { DockerContainer::Socks5Proxy, QObject::tr("SOCKS5 proxy server") } }; } QMap ContainerProps::containerDescriptions() @@ -131,7 +134,9 @@ QMap ContainerProps::containerDescriptions() { DockerContainer::Dns, QObject::tr("Replace the current DNS server with your own. This will increase your privacy level.") }, { DockerContainer::Sftp, - QObject::tr("Create a file vault on your server to securely store and transfer files.") } }; + QObject::tr("Create a file vault on your server to securely store and transfer files.") }, + { DockerContainer::Socks5Proxy, + QObject::tr("") } }; } QMap ContainerProps::containerDetailedDescriptions() @@ -240,7 +245,8 @@ QMap ContainerProps::containerDetailedDescriptions() QObject::tr("After installation, Amnezia will create a\n\n file storage on your server. " "You will be able to access it using\n FileZilla or other SFTP clients, " "as well as mount the disk on your device to access\n it directly from your device.\n\n" - "For more detailed information, you can\n find it in the support section under \"Create SFTP file storage.\" ") } + "For more detailed information, you can\n find it in the support section under \"Create SFTP file storage.\" ") }, + { DockerContainer::Socks5Proxy, QObject::tr("SOCKS5 proxy server") } }; } @@ -265,6 +271,7 @@ Proto ContainerProps::defaultProtocol(DockerContainer c) case DockerContainer::TorWebSite: return Proto::TorWebSite; case DockerContainer::Dns: return Proto::Dns; case DockerContainer::Sftp: return Proto::Sftp; + case DockerContainer::Socks5Proxy: return Proto::Socks5Proxy; default: return Proto::Any; } } @@ -367,6 +374,7 @@ bool ContainerProps::isShareable(DockerContainer container) case DockerContainer::TorWebSite: return false; case DockerContainer::Dns: return false; case DockerContainer::Sftp: return false; + case DockerContainer::Socks5Proxy: return false; default: return true; } } diff --git a/client/containers/containers_defs.h b/client/containers/containers_defs.h index f80cc097..a63e217b 100644 --- a/client/containers/containers_defs.h +++ b/client/containers/containers_defs.h @@ -28,7 +28,8 @@ namespace amnezia // non-vpn TorWebSite, Dns, - Sftp + Sftp, + Socks5Proxy }; Q_ENUM_NS(DockerContainer) } // namespace ContainerEnumNS diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 12ede703..081d86d6 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -106,7 +106,7 @@ ErrorCode ServerController::runContainerScript(const ServerCredentials &credenti if (e) return e; - QString runner = QString("sudo docker exec -i $CONTAINER_NAME bash %1 ").arg(fileName); + QString runner = QString("sudo docker exec -i $CONTAINER_NAME sh %1 ").arg(fileName); e = runScript(credentials, replaceVars(runner, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr); QString remover = QString("sudo docker exec -i $CONTAINER_NAME rm %1 ").arg(fileName); @@ -376,6 +376,10 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c return true; } + if (container == DockerContainer::Socks5Proxy) { + return true; + } + return false; } @@ -516,6 +520,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential const QJsonObject &amneziaWireguarConfig = config.value(ProtocolProps::protoToString(Proto::Awg)).toObject(); const QJsonObject &xrayConfig = config.value(ProtocolProps::protoToString(Proto::Xray)).toObject(); const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject(); + const QJsonObject &socks5ProxyConfig = config.value(ProtocolProps::protoToString(Proto::Socks5Proxy)).toObject(); Vars vars; @@ -613,6 +618,14 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); + // Socks5 proxy vars + vars.append({ { "$SOCKS5_PROXY_PORT", socks5ProxyConfig.value(config_key::port).toString(protocols::socks5Proxy::defaultPort) } }); + auto username = socks5ProxyConfig.value(config_key:: userName).toString(); + auto password = socks5ProxyConfig.value(config_key::password).toString(); + QString socks5user = (!username.isEmpty() && !password.isEmpty()) ? QString("users %1:CL:%2").arg(username, password) : ""; + vars.append({ { "$SOCKS5_USER", socks5user } }); + vars.append({ { "$SOCKS5_AUTH_TYPE", socks5user.isEmpty() ? "none" : "strong" } }); + QString serverIp = NetworkUtilities::getIPAddress(credentials.hostName); if (!serverIp.isEmpty()) { vars.append({ { "$SERVER_IP_ADDRESS", serverIp } }); diff --git a/client/core/scripts_registry.cpp b/client/core/scripts_registry.cpp index 4e720845..95b5df4a 100644 --- a/client/core/scripts_registry.cpp +++ b/client/core/scripts_registry.cpp @@ -18,6 +18,7 @@ QString amnezia::scriptFolder(amnezia::DockerContainer container) case DockerContainer::TorWebSite: return QLatin1String("website_tor"); case DockerContainer::Dns: return QLatin1String("dns"); case DockerContainer::Sftp: return QLatin1String("sftp"); + case DockerContainer::Socks5Proxy: return QLatin1String("socks5_proxy"); default: return QString(); } } diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index 9373c8bb..bcae339c 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -77,7 +77,8 @@ QMap ProtocolProps::protocolHumanNames() { Proto::TorWebSite, "Website in Tor network" }, { Proto::Dns, "DNS Service" }, - { Proto::Sftp, QObject::tr("Sftp service") } }; + { Proto::Sftp, QObject::tr("Sftp service") }, + { Proto::Socks5Proxy, QObject::tr("SOCKS5 proxy server") } }; } QMap ProtocolProps::protocolDescriptions() @@ -102,6 +103,7 @@ amnezia::ServiceType ProtocolProps::protocolService(Proto p) case Proto::TorWebSite: return ServiceType::Other; case Proto::Dns: return ServiceType::Other; case Proto::Sftp: return ServiceType::Other; + case Proto::Socks5Proxy: return ServiceType::Other; default: return ServiceType::Other; } } @@ -113,6 +115,7 @@ int ProtocolProps::getPortForInstall(Proto p) case WireGuard: case ShadowSocks: case OpenVpn: + case Socks5Proxy: return QRandomGenerator::global()->bounded(30000, 50000); default: return defaultPort(p); @@ -135,6 +138,7 @@ int ProtocolProps::defaultPort(Proto p) case Proto::TorWebSite: return -1; case Proto::Dns: return 53; case Proto::Sftp: return 222; + case Proto::Socks5Proxy: return 38080; default: return -1; } } @@ -154,6 +158,7 @@ bool ProtocolProps::defaultPortChangeable(Proto p) case Proto::TorWebSite: return false; case Proto::Dns: return false; case Proto::Sftp: return true; + case Proto::Socks5Proxy: return true; default: return false; } } @@ -175,6 +180,7 @@ TransportProto ProtocolProps::defaultTransportProto(Proto p) case Proto::TorWebSite: return TransportProto::Tcp; case Proto::Dns: return TransportProto::Udp; case Proto::Sftp: return TransportProto::Tcp; + case Proto::Socks5Proxy: return TransportProto::Tcp; } } @@ -195,6 +201,7 @@ bool ProtocolProps::defaultTransportProtoChangeable(Proto p) case Proto::TorWebSite: return false; case Proto::Dns: return false; case Proto::Sftp: return false; + case Proto::Socks5Proxy: return false; default: return false; } return false; diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index c98735b0..56be0d7d 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -84,6 +84,7 @@ namespace amnezia constexpr char awg[] = "awg"; constexpr char xray[] = "xray"; constexpr char ssxray[] = "ssxray"; + constexpr char socks5proxy[] = "socks5proxy"; constexpr char configVersion[] = "config_version"; @@ -216,6 +217,14 @@ namespace amnezia constexpr char defaultUnderloadPacketMagicHeader[] = "1766607858"; } + namespace socks5Proxy + { + constexpr char defaultUserName[] = "proxy_user"; + constexpr char defaultPort[] = "38080"; + + constexpr char proxyConfigPath[] = "/usr/local/3proxy/conf/3proxy.cfg"; + } + } // namespace protocols namespace ProtocolEnumNS @@ -244,7 +253,8 @@ namespace amnezia // non-vpn TorWebSite, Dns, - Sftp + Sftp, + Socks5Proxy }; Q_ENUM_NS(Proto) diff --git a/client/resources.qrc b/client/resources.qrc index 49fd66d3..84296462 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -198,7 +198,7 @@ ui/qml/Pages2/PageProtocolOpenVpnSettings.qml ui/qml/Pages2/PageProtocolShadowSocksSettings.qml ui/qml/Pages2/PageProtocolCloakSettings.qml - ui/qml/Pages2/PageProtocolXraySettings.qml + ui/qml/Pages2/PageProtocolXraySettings.qml ui/qml/Pages2/PageProtocolRaw.qml ui/qml/Pages2/PageSettingsLogging.qml ui/qml/Pages2/PageServiceSftpSettings.qml @@ -239,5 +239,10 @@ images/controls/alert-circle.svg images/controls/file-check-2.svg ui/qml/Controls2/WarningType.qml + ui/qml/Pages2/PageServiceSocksProxySettings.qml + server_scripts/socks5_proxy/run_container.sh + server_scripts/socks5_proxy/Dockerfile + server_scripts/socks5_proxy/configure_container.sh + server_scripts/socks5_proxy/start.sh diff --git a/client/server_scripts/socks5_proxy/Dockerfile b/client/server_scripts/socks5_proxy/Dockerfile new file mode 100644 index 00000000..7a38682f --- /dev/null +++ b/client/server_scripts/socks5_proxy/Dockerfile @@ -0,0 +1,10 @@ +FROM 3proxy/3proxy:latest + +LABEL maintainer="AmneziaVPN" + +RUN mkdir -p /opt/amnezia +RUN echo -e "#!/bin/bash\ntail -f /dev/null" > /opt/amnezia/start.sh +RUN chmod a+x /opt/amnezia/start.sh + +ENTRYPOINT [ "/bin/sh", "/opt/amnezia/start.sh" ] +CMD [ "" ] \ No newline at end of file diff --git a/client/server_scripts/socks5_proxy/configure_container.sh b/client/server_scripts/socks5_proxy/configure_container.sh new file mode 100644 index 00000000..d271b65e --- /dev/null +++ b/client/server_scripts/socks5_proxy/configure_container.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +echo -e "#!/bin/3proxy" > /usr/local/3proxy/conf/3proxy.cfg +echo -e "config /usr/local/3proxy/conf/3proxy.cfg" >> /usr/local/3proxy/conf/3proxy.cfg +echo -e "timeouts 1 5 30 60 180 1800 15 60" >> /usr/local/3proxy/conf/3proxy.cfg + +echo -e "$SOCKS5_USER" >> /usr/local/3proxy/conf/3proxy.cfg + +echo -e "log /usr/local/3proxy/logs/3proxy.log" >> /usr/local/3proxy/conf/3proxy.cfg +echo -e "logformat \"-\\\"\"+_G{\"\"time_unix\"\":%t, \"\"proxy\"\":{\"\"type:\"\":\"\"%N\"\", \"\"port\"\":%p}, \"\"error\"\":{\"\"code\"\":\"\"%E\"\"}, \"\"auth\"\":{\"\"user\"\":\"\"%U\"\"}, \"\"client\"\":{\"\"ip\"\":\"\"%C\"\", \"\"port\"\":%c}, \"\"server\"\":{\"\"ip\"\":\"\"%R\"\", \"\"port\"\":%r}, \"\"bytes\"\":{\"\"sent\"\":%O, \"\"received\"\":%I}, \"\"request\"\":{\"\"hostname\"\":\"\"%n\"\"}, \"\"message\"\":\"\"%T\"\"}\"" >> /usr/local/3proxy/conf/3proxy.cfg +echo -e "auth $SOCKS5_AUTH_TYPE" >> /usr/local/3proxy/conf/3proxy.cfg +echo -e "socks -p$SOCKS5_PROXY_PORT" >> /usr/local/3proxy/conf/3proxy.cfg \ No newline at end of file diff --git a/client/server_scripts/socks5_proxy/run_container.sh b/client/server_scripts/socks5_proxy/run_container.sh new file mode 100644 index 00000000..38ff863a --- /dev/null +++ b/client/server_scripts/socks5_proxy/run_container.sh @@ -0,0 +1,5 @@ +sudo docker run -d \ +--restart always \ +-p $SOCKS5_PROXY_PORT:$SOCKS5_PROXY_PORT/tcp \ +--name $CONTAINER_NAME \ +$CONTAINER_NAME diff --git a/client/server_scripts/socks5_proxy/start.sh b/client/server_scripts/socks5_proxy/start.sh new file mode 100644 index 00000000..98555d4e --- /dev/null +++ b/client/server_scripts/socks5_proxy/start.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# This scripts copied from Amnezia client to Docker container to /opt/amnezia and launched every time container starts + +echo "Container startup" + +/bin/3proxy /usr/local/3proxy/conf/3proxy.cfg \ No newline at end of file diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index e743d22c..514091d4 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -123,6 +123,9 @@ void InstallController::install(DockerContainer container, int port, TransportPr } else if (container == DockerContainer::Sftp) { containerConfig.insert(config_key::userName, protocols::sftp::defaultUserName); containerConfig.insert(config_key::password, Utils::getRandomString(10)); + } else if (container == DockerContainer::Socks5Proxy) { + containerConfig.insert(config_key::userName, protocols::socks5Proxy::defaultUserName); + containerConfig.insert(config_key::password, Utils::getRandomString(10)); } config.insert(config_key::container, ContainerProps::containerToString(container)); @@ -362,7 +365,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia if (containerInfo.isEmpty()) { continue; } - const static QRegularExpression containerAndPortRegExp("(amnezia[-a-z]*).*?:([0-9]*)->[0-9]*/(udp|tcp).*"); + const static QRegularExpression containerAndPortRegExp("(amnezia[-a-z0-9]*).*?:([0-9]*)->[0-9]*/(udp|tcp).*"); QRegularExpressionMatch containerAndPortMatch = containerAndPortRegExp.match(containerInfo); if (containerAndPortMatch.hasMatch()) { QString name = containerAndPortMatch.captured(1); @@ -427,6 +430,20 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia containerConfig.insert(config_key::userName, userName); containerConfig.insert(config_key::password, password); + } else if (protocol == Proto::Socks5Proxy) { + QString proxyConfig = serverController->getTextFileFromContainer(container, credentials, + protocols::socks5Proxy::proxyConfigPath, errorCode); + + const static QRegularExpression usernameAndPasswordRegExp("users (\\w+):CL:(\\w+)"); + QRegularExpressionMatch usernameAndPasswordMatch = usernameAndPasswordRegExp.match(proxyConfig); + + if (usernameAndPasswordMatch.hasMatch()) { + QString userName = usernameAndPasswordMatch.captured(1); + QString password = usernameAndPasswordMatch.captured(2); + + containerConfig.insert(config_key::userName, userName); + containerConfig.insert(config_key::password, password); + } } config.insert(config_key::container, ContainerProps::containerToString(container)); @@ -603,6 +620,10 @@ void InstallController::clearCachedProfile(QSharedPointer serv int serverIndex = m_serversModel->getProcessedServerIndex(); DockerContainer container = static_cast(m_containersModel->getProcessedContainerIndex()); + if (ContainerProps::containerService(container) == ServiceType::Other) { + return; + } + QJsonObject containerConfig = m_containersModel->getContainerConfig(container); ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); diff --git a/client/ui/controllers/pageController.h b/client/ui/controllers/pageController.h index 1fdb1e81..c9d655ba 100644 --- a/client/ui/controllers/pageController.h +++ b/client/ui/controllers/pageController.h @@ -35,6 +35,7 @@ namespace PageLoader PageServiceSftpSettings, PageServiceTorWebsiteSettings, PageServiceDnsSettings, + PageServiceSocksProxySettings, PageSetupWizardStart, PageSetupWizardCredentials, diff --git a/client/ui/models/protocols_model.cpp b/client/ui/models/protocols_model.cpp index b2838ce3..32447cd4 100644 --- a/client/ui/models/protocols_model.cpp +++ b/client/ui/models/protocols_model.cpp @@ -86,6 +86,7 @@ PageLoader::PageEnum ProtocolsModel::protocolPage(Proto protocol) const case Proto::TorWebSite: return PageLoader::PageEnum::PageServiceTorWebsiteSettings; case Proto::Dns: return PageLoader::PageEnum::PageServiceDnsSettings; case Proto::Sftp: return PageLoader::PageEnum::PageServiceSftpSettings; + case Proto::Socks5Proxy: return PageLoader::PageEnum::PageServiceSocksProxySettings; default: return PageLoader::PageEnum::PageProtocolOpenVpnSettings; } } diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 17535e5a..3f167029 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -548,6 +548,8 @@ QStringList ServersModel::getAllInstalledServicesName(const int serverIndex) servicesName.append("SFTP"); } else if (container == DockerContainer::TorWebSite) { servicesName.append("TOR"); + } else if (container == DockerContainer::Socks5Proxy) { + servicesName.append("SOCKS5"); } } } diff --git a/client/ui/models/services/socks5ProxyConfigModel.cpp b/client/ui/models/services/socks5ProxyConfigModel.cpp new file mode 100644 index 00000000..f68670df --- /dev/null +++ b/client/ui/models/services/socks5ProxyConfigModel.cpp @@ -0,0 +1,80 @@ +#include "socks5ProxyConfigModel.h" + +#include "protocols/protocols_defs.h" + +Socks5ProxyConfigModel::Socks5ProxyConfigModel(QObject *parent) : QAbstractListModel(parent) +{ +} + +int Socks5ProxyConfigModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return 1; +} + +bool Socks5ProxyConfigModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid() || index.row() < 0 || index.row() >= ContainerProps::allContainers().size()) { + return false; + } + + switch (role) { + case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; + case Roles::UserNameRole: m_protocolConfig.insert(config_key::userName, value.toString()); break; + case Roles::PasswordRole: m_protocolConfig.insert(config_key::password, value.toString()); break; + } + + emit dataChanged(index, index, QList { role }); + return true; +} + +QVariant Socks5ProxyConfigModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= rowCount()) { + return false; + } + + switch (role) { + case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(); + case Roles::UserNameRole: + return m_protocolConfig.value(config_key::userName).toString(); + case Roles::PasswordRole: return m_protocolConfig.value(config_key::password).toString(); + } + + return QVariant(); +} + +void Socks5ProxyConfigModel::updateModel(const QJsonObject &config) +{ + beginResetModel(); + m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); + + m_fullConfig = config; + QJsonObject protocolConfig = config.value(config_key::socks5proxy).toObject(); + + m_protocolConfig.insert(config_key::userName, + protocolConfig.value(config_key::userName).toString()); + + m_protocolConfig.insert(config_key::password, protocolConfig.value(config_key::password).toString()); + + m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString()); + + endResetModel(); +} + +QJsonObject Socks5ProxyConfigModel::getConfig() +{ + m_fullConfig.insert(config_key::socks5proxy, m_protocolConfig); + return m_fullConfig; +} + +QHash Socks5ProxyConfigModel::roleNames() const +{ + QHash roles; + + roles[PortRole] = "port"; + roles[UserNameRole] = "username"; + roles[PasswordRole] = "password"; + + return roles; +} diff --git a/client/ui/models/services/socks5ProxyConfigModel.h b/client/ui/models/services/socks5ProxyConfigModel.h new file mode 100644 index 00000000..fc6f2fd4 --- /dev/null +++ b/client/ui/models/services/socks5ProxyConfigModel.h @@ -0,0 +1,40 @@ +#ifndef SOCKS5PROXYCONFIGMODEL_H +#define SOCKS5PROXYCONFIGMODEL_H + +#include +#include + +#include "containers/containers_defs.h" + +class Socks5ProxyConfigModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + PortRole = Qt::UserRole + 1, + UserNameRole, + PasswordRole + }; + + explicit Socks5ProxyConfigModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + +public slots: + void updateModel(const QJsonObject &config); + QJsonObject getConfig(); + +protected: + QHash roleNames() const override; + +private: + DockerContainer m_container; + QJsonObject m_protocolConfig; + QJsonObject m_fullConfig; +}; + +#endif // SOCKS5PROXYCONFIGMODEL_H diff --git a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml new file mode 100644 index 00000000..95343f63 --- /dev/null +++ b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml @@ -0,0 +1,385 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import SortFilterProxyModel 0.2 + +import PageEnum 1.0 +import ContainerProps 1.0 + +import "./" +import "../Controls2" +import "../Controls2/TextTypes" +import "../Config" +import "../Components" + +PageType { + id: root + + defaultActiveFocusItem: listview + + Connections { + target: InstallController + + function onUpdateContainerFinished() { + PageController.showNotificationMessage(qsTr("Settings updated successfully")) + } + } + + Item { + id: focusItem + KeyNavigation.tab: backButton + } + + ColumnLayout { + id: backButtonLayout + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + anchors.topMargin: 20 + + BackButtonType { + id: backButton + KeyNavigation.tab: listview + } + } + + FlickableType { + id: fl + anchors.top: backButtonLayout.bottom + anchors.bottom: parent.bottom + contentHeight: listview.implicitHeight + + ListView { + id: listview + + width: parent.width + height: listview.contentItem.height + + clip: true + interactive: false + + model: Socks5ProxyConfigModel + + onFocusChanged: { + if (focus) { + listview.currentItem.focusItemId.forceActiveFocus() + } + } + + delegate: Item { + implicitWidth: listview.width + implicitHeight: content.implicitHeight + + property alias focusItemId: hostLabel.rightButton + + ColumnLayout { + id: content + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + spacing: 0 + + HeaderType { + Layout.fillWidth: true + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + headerText: qsTr("SOCKS5 settings") + } + + LabelWithButtonType { + id: hostLabel + Layout.fillWidth: true + Layout.topMargin: 32 + + parentFlickable: fl + KeyNavigation.tab: portLabel.rightButton + + text: qsTr("Host") + descriptionText: ServersModel.getProcessedServerData("hostName") + + descriptionOnTop: true + + rightImageSource: "qrc:/images/controls/copy.svg" + rightImageColor: "#D7D8DB" + + clickedFunction: function() { + GC.copyToClipBoard(descriptionText) + PageController.showNotificationMessage(qsTr("Copied")) + if (!GC.isMobile()) { + this.rightButton.forceActiveFocus() + } + } + } + + LabelWithButtonType { + id: portLabel + Layout.fillWidth: true + + text: qsTr("Port") + descriptionText: port + + descriptionOnTop: true + + parentFlickable: fl + KeyNavigation.tab: usernameLabel.rightButton + + rightImageSource: "qrc:/images/controls/copy.svg" + rightImageColor: "#D7D8DB" + + clickedFunction: function() { + GC.copyToClipBoard(descriptionText) + PageController.showNotificationMessage(qsTr("Copied")) + if (!GC.isMobile()) { + this.rightButton.forceActiveFocus() + } + } + } + + LabelWithButtonType { + id: usernameLabel + Layout.fillWidth: true + + text: qsTr("User name") + descriptionText: username + + descriptionOnTop: true + + parentFlickable: fl + KeyNavigation.tab: passwordLabel.eyeButton + + rightImageSource: "qrc:/images/controls/copy.svg" + rightImageColor: "#D7D8DB" + + clickedFunction: function() { + GC.copyToClipBoard(descriptionText) + PageController.showNotificationMessage(qsTr("Copied")) + if (!GC.isMobile()) { + this.rightButton.forceActiveFocus() + } + } + } + + LabelWithButtonType { + id: passwordLabel + Layout.fillWidth: true + + text: qsTr("Password") + descriptionText: password + + descriptionOnTop: true + + parentFlickable: fl + eyeButton.KeyNavigation.tab: passwordLabel.rightButton + rightButton.KeyNavigation.tab: changeSettingsButton + + rightImageSource: "qrc:/images/controls/copy.svg" + rightImageColor: "#D7D8DB" + + buttonImageSource: hideDescription ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg" + + clickedFunction: function() { + GC.copyToClipBoard(descriptionText) + PageController.showNotificationMessage(qsTr("Copied")) + if (!GC.isMobile()) { + this.rightButton.forceActiveFocus() + } + } + } + + DrawerType2 { + id: changeSettingsDrawer + parent: root + + anchors.fill: parent + expandedHeight: root.height * 0.9 + + onClosed: { + if (!GC.isMobile()) { + focusItem.forceActiveFocus() + } + } + + expandedContent: ColumnLayout { + property string tempPort: port + property string tempUsername: username + property string tempPassword: password + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 32 + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 0 + + Connections { + target: changeSettingsDrawer + function onOpened() { + if (!GC.isMobile()) { + drawerFocusItem.forceActiveFocus() + } + tempPort = port + tempUsername = username + tempPassword = password + } + function onClosed() { + port = tempPort + username = tempUsername + password = tempPassword + portTextField.textFieldText = port + usernameTextField.textFieldText = username + passwordTextField.textFieldText = password + } + } + + Item { + id: drawerFocusItem + KeyNavigation.tab: portTextField.textField + } + + HeaderType { + Layout.fillWidth: true + + headerText: qsTr("SOCKS5 settings") + } + + TextFieldWithHeaderType { + id: portTextField + + Layout.fillWidth: true + Layout.topMargin: 40 + parentFlickable: fl + + headerText: qsTr("Port") + textFieldText: port + textField.maximumLength: 5 + textField.validator: IntValidator { bottom: 1; top: 65535 } + + textField.onEditingFinished: { + textFieldText = textField.text.replace(/^\s+|\s+$/g, '') + if (textFieldText !== port) { + port = textFieldText + } + } + + KeyNavigation.tab: usernameTextField.textField + } + + TextFieldWithHeaderType { + id: usernameTextField + + Layout.fillWidth: true + Layout.topMargin: 16 + parentFlickable: fl + + headerText: qsTr("Username") + textFieldPlaceholderText: "username" + textFieldText: username + textField.maximumLength: 32 + + textField.onEditingFinished: { + textFieldText = textField.text.replace(/^\s+|\s+$/g, '') + if (textFieldText !== username) { + username = textFieldText + } + } + + KeyNavigation.tab: passwordTextField.textField + } + + TextFieldWithHeaderType { + id: passwordTextField + + property bool hidePassword: true + + Layout.fillWidth: true + Layout.topMargin: 16 + parentFlickable: fl + + headerText: qsTr("Password") + textFieldPlaceholderText: "password" + textFieldText: password + textField.maximumLength: 32 + + textField.echoMode: hidePassword ? TextInput.Password : TextInput.Normal + buttonImageSource: textFieldText !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") + : "" + + clickedFunc: function() { + hidePassword = !hidePassword + } + + textField.onFocusChanged: { + textFieldText = textField.text.replace(/^\s+|\s+$/g, '') + if (textFieldText !== password) { + password = textFieldText + } + } + + KeyNavigation.tab: saveButton + } + + BasicButtonType { + id: saveButton + + Layout.fillWidth: true + Layout.topMargin: 24 + Layout.bottomMargin: 24 + + text: qsTr("Change connection settings") + Keys.onTabPressed: lastItemTabClicked(drawerFocusItem) + + clickedFunc: function() { + forceActiveFocus() + + if (!portTextField.textField.acceptableInput) { + portTextField.errorText = qsTr("The port must be in the range of 1 to 65535") + return + } + if (usernameTextField.textFieldText && passwordTextField.textFieldText === "") { + passwordTextField.errorText = qsTr("Password cannot be empty") + return + } else if (usernameTextField.textFieldText === "" && passwordTextField.textFieldText) { + usernameTextField.errorText = qsTr("Username cannot be empty") + return + } + + PageController.goToPage(PageEnum.PageSetupWizardInstalling) + InstallController.updateContainer(Socks5ProxyConfigModel.getConfig()) + tempPort = portTextField.textFieldText + tempUsername = usernameTextField.textFieldText + tempPassword = passwordTextField.textFieldText + changeSettingsDrawer.close() + } + } + } + } + + BasicButtonType { + id: changeSettingsButton + + Layout.fillWidth: true + Layout.topMargin: 24 + Layout.bottomMargin: 24 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + text: qsTr("Change connection settings") + Keys.onTabPressed: lastItemTabClicked(focusItem) + + clickedFunc: function() { + forceActiveFocus() + changeSettingsDrawer.open() + } + } + } + } + } + } +} diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml index 97288733..a0c668be 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml @@ -18,6 +18,8 @@ import "../Components" PageType { id: root + property bool isClearCacheVisible: ServersModel.isProcessedServerHasWriteAccess() && !ContainersModel.isServiceContainer(ContainersModel.getProcessedContainerIndex()) + defaultActiveFocusItem: focusItem Item { @@ -103,6 +105,7 @@ PageType { case ProtocolEnum.Awg: AwgConfigModel.updateModel(ProtocolsModel.getConfig()); break; case ProtocolEnum.Xray: XrayConfigModel.updateModel(ProtocolsModel.getConfig()); break; case ProtocolEnum.Ipsec: Ikev2ConfigModel.updateModel(ProtocolsModel.getConfig()); break; + case ProtocolEnum.Socks5Proxy: Socks5ProxyConfigModel.updateModel(ProtocolsModel.getConfig()); break; } PageController.goToPage(protocolPage); } @@ -124,7 +127,7 @@ PageType { Layout.fillWidth: true - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: root.isClearCacheVisible KeyNavigation.tab: removeButton text: qsTr("Clear %1 profile").arg(ContainersModel.getProcessedContainerName()) @@ -167,7 +170,7 @@ PageType { Layout.leftMargin: 16 Layout.rightMargin: 16 - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: root.isClearCacheVisible } LabelWithButtonType { diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index b694dda0..f27873c6 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -261,6 +261,11 @@ PageType { Keys.onTabPressed: lastItemTabClicked(focusItem) clickedFunc: function() { + if (!port.textField.acceptableInput) { + port.errorText = qsTr("The port must be in the range of 1 to 65535") + return + } + PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.install(dockerContainer, port.textFieldText, transportProtoSelector.currentIndex) } From afdfbdbc59e1bb5e164378256adf9fbefd900aae Mon Sep 17 00:00:00 2001 From: albexk Date: Mon, 17 Jun 2024 17:41:59 +0300 Subject: [PATCH 6/7] Update Android icons --- client/android/res/mipmap-hdpi/icon.png | Bin 3338 -> 6616 bytes client/android/res/mipmap-hdpi/icon_round.png | Bin 4225 -> 8393 bytes client/android/res/mipmap-ldpi/icon.png | Bin 1984 -> 2686 bytes client/android/res/mipmap-ldpi/icon_round.png | Bin 1723 -> 3198 bytes client/android/res/mipmap-mdpi/icon.png | Bin 3517 -> 3918 bytes client/android/res/mipmap-mdpi/icon_round.png | Bin 2624 -> 4798 bytes client/android/res/mipmap-xhdpi/icon.png | Bin 9958 -> 9472 bytes .../android/res/mipmap-xhdpi/icon_round.png | Bin 5543 -> 12311 bytes client/android/res/mipmap-xxhdpi/icon.png | Bin 19030 -> 15513 bytes .../android/res/mipmap-xxhdpi/icon_round.png | Bin 8247 -> 21130 bytes client/android/res/mipmap-xxxhdpi/icon.png | Bin 30603 -> 22335 bytes .../android/res/mipmap-xxxhdpi/icon_round.png | Bin 11186 -> 30527 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/client/android/res/mipmap-hdpi/icon.png b/client/android/res/mipmap-hdpi/icon.png index d0f203630e5ec2ec3b1985288cefe1b86bb047e7..f1bf806b8555b06e9864ecb2c9e114cca0b188d1 100644 GIT binary patch literal 6616 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 Pw*jE!)#Per%p(2=LxpR& delta 3334 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 IM6N<$g5_QSWB>pF diff --git a/client/android/res/mipmap-ldpi/icon.png b/client/android/res/mipmap-ldpi/icon.png index 00b978f5ec255ca0c3fe63be100c481d11b850eb..354d642d46bda0ee071a33880da86811aeab0e29 100644 GIT binary patch literal 2686 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 literal 1984 zcmV;x2S50UP)Y%(yV+D6;K=rp0xPGy_=XO+4i{jsUrwEjW+ zwU0lWkhZB68`Zj1EJf-%w8A8W2%=$WlL8^6goeZp`JhRhIA8XAd%xfNnp`D*?|tvb zIp;agIrqGzwRM|A2m#?gpcJCVx@@32`Y9UgnlXP+z6Ek8|7A_=;nR9f&1~?b@VkP= zktl7pa6YdDX`xj03A_h*4k{I{-|}@nO1;8uWAz+W%~e#M@U`b&A#xqpLZCtQIeMjl zgy^&7D{UCx=acCBG+d&tHw~&@_13P%n0+9Sp6^wlp+dBB1uLOO?&~>O>wlPyYVm& zT#h)7<1tDLmWr@H76sJSkjv0k+dA0HZ`rj6dk%jOiDa{woEaNMav_VM>jUU{?>&@8 zgMk+O9p{Q8#0!+T0#X3Pq$SrAet}4swx;)zrd_+y+_)3LaKwXBDqexEst_h7vpD{f zmobsedJwd&hf8om9({D1h67S#?K7$rkQ0Z0cLI?_0_8M>7_CBSi~4;y))*80+~Oi$ z{q+gFfAL}o0-D$kw9K-qs_I{Am-lZD z42r~dg5bI7+39>ngpcH$an1nDdx5O~d#>)fP4 zTGC&^_U{}LdeBIDhFPE?vDU{NJ74 zhfU0iBk5MQ`vDF#`|)hkJQ88x?mWn9L1n@ca+sXJqo?E9Z%N_*Igh?me;0n+{8$H8 z<_j3^y)5R&Zw{g(=rDn4sA$ERf4@tIKkY@JW*TLoDZKQ|myk+^@tZ3Yrw1u=tI|d; z&Tm=nxnPp1U1U>j0*lkL7&vnl3O2H}eIM4Ainu#))u8tJn}5TPj~~OUue?AeGE+Ey z^hwfCT>&~bj^bvBC@w`8_v|$ZbgAb!1{C^d%BLH`jL8)+FoIh z7#hBhk^f)E&wkq@#$Cw@a1YX(pzcgXPsZewZ#~ z=u1y;A%}NVX+LT+Pa7!AAvQ~mefnp`0kx-oM?f4AV#CWk>QZ@01Bl>-J=JCO&Wk@v;bk##Vc{@E&q_D1O zmj}cpAy*_6jH7qpFT&EzTiTIMe;+$LpGH1Ehd_wsvj?LlS`-M-*+Zjpda%d@`|;;P z^5~O&4l+5jUd6v#KlpW_!3Q&QccfWtI5B>m-nj8T`Fi(0_9lTyXchhJFjZ2SJ$8}G zTQ=vK)W^tovaev!(q$XZvQRN!7LUhY<4CIPWY+TW~0e|cn!oSXjk*afWps|R}mBf%tTI=A#og&T-JCrFwQVl-*{+j`~MUAJ> zHFbgC>rZNxVKOmouUW^)?QyYwVm41EW`UmTFc(TglwfgCI ziO0oQ7b3}I6Se$qVA74jNN>$@%6%{Zot zQSZ$cliN1ZO{8Bd_fwB+Z4Q(ajMVed36pG~KTbSQLdCW9DTY$Fs`VRvtWuv|Y+Gif zSyu+A^^K_4NLkh%SSW3zto^MhOEMe0jmhZ6+G~kiW+CXY&Jv~tszl^yROshHc6VtC SSG6nv00009nHmD z0MgPfgvSo0uMGhHf&dWw3II+ntl)J3z(@eVrZoT{E^gS}vYPc2FBUYmS{mxWpMNU1 ztt9cnx#Wg2^#lM0mVX)qWMn}vOj<8ZZ6xhF4HF|+N|QSWcCpjcR97`H`4E&A5N$s0 z*NL5P@_GEk`>|Dx!s)(}D;<$>!aKK7Q!1%&0#@fLurmsAGQ2)stLC!- zBk~=4ZNomXyBY-IgpRrj8x>k5ml9V_kr^VRq5wI_ETkst-JrMv{3%#ZBOUUF;s^Ja zr!-=3VIhS@EMSuO@uDTuSI~YGT__I)VF^-7kJA>aqEvluuSkJZm8Usr#BZCzz%Ng93{JMgnSm7vxbg@zrKYziVBG0lVNWyJoe z>qr4OHxkcBL0+v_zQXEk84m5rght>jLcx)!R2&RdRoYDTzS|tT2aGmDpXHG{5}C6c z!1t(_Hq`7pBDV4i)%JKxnbCLmV7k48dUioF8QsDEV|F3 zs%+pn^}D1DIzAT`8#-zHraziIQKWL2>>$vV&&ejo+xL|59z-(Y7W>jhCrgthuvI~9|uSl=Zc{3Zn?t^u$HsptP9rStIpOo=eJ`EvVReF{#z zMmzN1QT+|s$z7l3tJeDHl9=x+imZqqu}Aj`{B1CTSDyX&gzM~zw**Qsy_25G?LlyW z8Gr3PO2y;lhk=J0${%mZjZLWQP4-|c4A>gHb{3nPA1w@WmH4ahg?0x=Y{}{;Mcl^S z_m)(h46k#UIj81K^%-Td067VyYNzh!&=8_%nrbRI@OQ7@*@t0&f0pHt$G$!JW)>Ym zyLf`;g5dpII$xki!VTC$a{Q}$*elZX`vntTJGn`u21!JIi+o6QRzNDKs}d z7_#jZrTtjfJx@;J2CBVhH<;GU#R#<;GUP#2E1u9j|a0xzlhvIGW5d{}R_joPuP90xK72l5MR%@LmlT9mYdtYr5Rzg$1-N@RtZ zKKT6k#gEGd)C$l$?paN5q6{X-B<0})3@=9>&QABs?)*`FPp}$}%kfPr!R}(LL8DaW zh~C|u*vf70xdoDG5gfeGnZWj3u;Le!?Rwqt6fW}z^6kH-C{^givzOP~KS&So%~nx#oX^`Z zzXM|yc&+*9)sl~ROSYjg6(XufEwtSO_1tGKK-LYL3cg5P`x`W^v!FoE}3$Cf#OXE@!(nG%Otk9ui zp&Q*S_}X`gs-{Ltj*wSSp5nO{e!Ttgr8Hdq-TNs0OlSy>DeJo8@5i9YsGyaz{+4d< zOX#rhTgui#f1Mk>X6l2hhOw+joP1qN|kM!}Mg#6alwH^$CapqY!v+pn6 zkH`8g+Q3~}!;?k7rDf~dC|s5C21PIQcj-ad42(xuj*4PF@Xd4F8>S?nA}Da=M|JUyo~A z;rmkh8yxu1Iw}fY7dxA1UP!6!(U9DbuKS1#b#*M-Rdg0(xtMC)!(5amZ}jxRs5>Q? zE$pG2hdt~PVW%a=fjll3rU+>0oF&Y+p4_SaN)@`hz44@f<>8dk)Q*AsZ^ZT5qaQd1 zw<7?1^;$_o*JndoF$@K?TD}LiS<;K#aMW|YOS2E)bEzqe;&2;s{J8UfpgDV%gh^l9n0v@b-Nh76vvn^b4&Ii!f4W zW*l%&Iux|f(U~@9XDqF4pKmg zr`j$LF&UM+6jaED7x-;%a`qKHhH_*&z&GLtt|gcXq(8h`GhlA!6h$BBN?++0hU^Lp zzN}z11XJ2!t{P`APNDv;y~-Q1#O&;%q1W2RZgFl&Z`a!D=P>+teA% zQ9ANxlUhy(ZC1JRB4^8LV6c}wtyGX#LM2s%K>5M;cy`UOadk?CIJ_dlr@l)M!;kd zk`kg45(o*2EaqjVe*vz~?VTR`{eR$xu6g+dApE}sFDF+APcIu+w|_A*2uT=1M)JQQ T2n6`-f&ny(KuIZj#`< delta 1721 zcmV;q21fb*7`qK2iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pRf}e*tq+ zM?wIu&K&6g000DMK}|sb0I`n?{9y$E00vM=L_t(|0i{=aY*SSj|FvDWbzQr5FT0hN zyNx{)J67pu!-NHw{V*NIu&p|Bl2K`p2)9t0Q9!UYZYo${84{4Sme+aZ`1yIB$ z23tZEDWkHe%#ak&YPANUc{RLe925~UIWqH?BLvW6tfsPqDnPZANF>KYAy1f*2631O znTrY$A~@NTEfH`+dQLvGGt)^bUbhKP7Cno|sA#V57#c(u+XS7p9S05_gxzir_Bl(U zB-bA$0R^bTA;_7>GJ4D_ene6c3;NSq~ z15&B9JQ(@nO&hpc0x4P=jIa=MQ_wa=7u$$mKl>1)W|r$K6$*UyfAObysi;^;EPS~I z5{6-Dj2;zQSiHRqNpog%?JJc>aQ@r<9)$7q zN$9e3pin;nQ@wZhf3-gy=IT{1cz65#(JE}%ybT_Q6H2)pM?NaY#n0E`_~yBU*n@Vv z$1k2s?O~)*B&0yzn$?KuwW0RMDm=J!i5t_W=D}`upuYMn*KfIf1Fmc5k;Tk{*Zgv< ze69fD%os*(B8aR;So?bM>K8X*cX}qsr}s)2`N`oUPhl9$f9)Mc|9}}+edH7x^*mVb zwxj()ePGPmZ6Q&Tf}J})Kw&{DX3vU;&Gry(TO*<@4cPJBai zybu^utCJBG5rwWE6Ew-Qp^nocb!Hk-b_O>e85xPw=ju?ty9Sr*ZsC*H=VNt-2Zu^L zc=Naj_j;!&f5A`%crS`1jfShuo&U#kR@P#SIqZm!jz#g(_1xHqvk%Q|Gt??IO=dWC z`YhL{kf;*j?zw^s&2Bz&3RM^c(8KCTA$89H;#I_~smt($It|V~H=M)6F!lb0J9qws z%jNJ&BINIHEki+;CZIq<&vkgz4xG3Wp_x?zVv@+jg5rfF4{TVkeKrL?=T`;x-~i3{mt5n$5Kk$()cX z#k}NxSUTE}XuE}ct(c4ZtoUi)J1kY;#`uw$$@8&n`9{bRBnVT8apTS@G`7_sDo&1$ z-fM#7e-!&q-X!sF$HsgqmZor7o{ReqyPyS(5^@8oNGO*2cOETI#O?d%U^d^wtn?h{ zve|P+f0`b_o|=(hy9a%|N{I6~Vq#*FNPpqv z1#AoTW)af$aR?tZLzBdyySo#;{kAE>DB=1%DPGG7<91GQ=(;PI0+kkvM5F5v^U|L~GYW%+>3#azgGf4=( zOQK=R?^8UGCA-gMS$5)+%%=oHl$i1&e~uzn7;*|{Ga=9;nWPvcUqZ-P|G< zB|>@`KO!jki-g-aevmg+30dMX$tUdG58i)9bRj(_(%gr~$3EYgvwV}&CTpKH%HjQU z8Y-xR9j4(eL>#gL;}lWR_ajN$MWjn#Q4A*iJtxIT-u!>i?CSUO>F^&X#b>1T54C_B P00000NkvXXu0mjfSY|XL diff --git a/client/android/res/mipmap-mdpi/icon.png b/client/android/res/mipmap-mdpi/icon.png index e23a94a990c8f398f80ef8b89f89b5c83ccacf42..7a47bbfd00952af9374e1262cf5c7f521c625428 100644 GIT binary patch literal 3918 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 O0N^Ux${0oK(EkCDEkpYN delta 3515 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 diff --git a/client/android/res/mipmap-mdpi/icon_round.png b/client/android/res/mipmap-mdpi/icon_round.png index 0ed71d4cc68335cbf2a85260a233b5b2c9806ec1..0278a784e9bfa14ec71c2fea8aaab67230f81b28 100644 GIT binary patch delta 4785 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 Hu0mjf1`Z66 diff --git a/client/android/res/mipmap-xhdpi/icon.png b/client/android/res/mipmap-xhdpi/icon.png index 0c5408f8dcb9c8603615103e29e3688f37417b68..488456f18774b174a8081adb803cbb3f44ed0a02 100644 GIT binary patch literal 9472 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%0D?~Ilz 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 diff --git a/client/android/res/mipmap-xhdpi/icon_round.png b/client/android/res/mipmap-xhdpi/icon_round.png index a3e188230a960ff0eedcf6277477461d3dab7e22..4698722377b0a9fe4bd7d2a6611fb47583a48123 100644 GIT binary patch literal 12311 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 delta 5539 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 diff --git a/client/android/res/mipmap-xxhdpi/icon.png b/client/android/res/mipmap-xxhdpi/icon.png index 0f94f39ef69eaf8098290b3d9992d9c648f8b0f1..7700462d265e944d6715c95a56bf759b7ad0e107 100644 GIT binary patch literal 15513 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 OK%~VL#A-zhgZ>9>N;4J! literal 19030 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� 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 literal 8247 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 diff --git a/client/android/res/mipmap-xxxhdpi/icon.png b/client/android/res/mipmap-xxxhdpi/icon.png index 671b0ff92e5cf4e8fe774a95b49dfdc3f7f341c1..42127cf27061171bd5c958ecd9fce585d3d38db2 100644 GIT binary patch literal 22335 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

    ai5BE~v$iX5t%a(NZT=u!}+lXvW{A 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 NjD(_iov3lh{{v{#k?8;c literal 11186 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 Qg8%>k07*qoM6N<$f@`vY1^@s6 From 834b504dffc92e25efef4e8f9478b164fc471ef0 Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 18 Jun 2024 20:46:21 +0300 Subject: [PATCH 7/7] Android XRay (#840) * Add XRay module --- CMakeLists.txt | 4 +- client/3rd-prebuilt | 2 +- client/android/AndroidManifest.xml | 30 ++- client/android/build.gradle.kts | 4 +- client/android/gradle/libs.versions.toml | 3 + .../amnezia/vpn/protocol/openvpn/OpenVpn.kt | 14 +- .../protocolApi/src/main/kotlin/Protocol.kt | 9 +- client/android/qt/build.gradle.kts | 2 +- client/android/settings.gradle.kts | 2 + .../src/org/amnezia/vpn/AmneziaActivity.kt | 62 +++-- .../src/org/amnezia/vpn/AmneziaTileService.kt | 65 +++-- .../src/org/amnezia/vpn/AmneziaVpnService.kt | 85 ++++--- .../android/src/org/amnezia/vpn/AwgService.kt | 3 + .../src/org/amnezia/vpn/OpenVpnService.kt | 3 + .../org/amnezia/vpn/ServiceNotification.kt | 23 +- .../android/src/org/amnezia/vpn/VpnProto.kt | 67 +++++ .../src/org/amnezia/vpn/VpnRequestActivity.kt | 25 +- .../android/src/org/amnezia/vpn/VpnState.kt | 66 ++--- .../src/org/amnezia/vpn/XrayService.kt | 3 + .../vpn/protocol/wireguard/Wireguard.kt | 8 +- client/android/xray/build.gradle.kts | 19 ++ client/android/xray/libXray/build.gradle.kts | 6 + client/android/xray/src/main/kotlin/Xray.kt | 237 ++++++++++++++++++ .../xray/src/main/kotlin/XrayConfig.kt | 42 ++++ client/cmake/android.cmake | 3 + client/containers/containers_defs.cpp | 1 + 26 files changed, 637 insertions(+), 151 deletions(-) create mode 100644 client/android/src/org/amnezia/vpn/AwgService.kt create mode 100644 client/android/src/org/amnezia/vpn/OpenVpnService.kt create mode 100644 client/android/src/org/amnezia/vpn/VpnProto.kt create mode 100644 client/android/src/org/amnezia/vpn/XrayService.kt create mode 100644 client/android/xray/build.gradle.kts create mode 100644 client/android/xray/libXray/build.gradle.kts create mode 100644 client/android/xray/src/main/kotlin/Xray.kt create mode 100644 client/android/xray/src/main/kotlin/XrayConfig.kt diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f363dcd..28bb2266 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.5.3.0 +project(${PROJECT} VERSION 4.6.0.0 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 52) +set(APP_ANDROID_VERSION_CODE 53) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index eb43e90f..ea49bf87 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit eb43e90f389745af6d7ca3be92a96e400ba6dc6c +Subproject commit ea49bf8796afbc5bd70a0f98f4d99c9ea4792d80 diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index 9637b029..f1d2682b 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -136,8 +136,34 @@ + + + + + + + + + + + + + + , onError: (String) -> Unit) { - super.initialize(context, state, onError) - loadSharedLibrary(context, "ovpn3") - this.context = context + override fun internalInit() { + if (!isInitialized) loadSharedLibrary(context, "ovpn3") + if (this::scope.isInitialized) { + scope.cancel() + } scope = CoroutineScope(Dispatchers.IO) } diff --git a/client/android/protocolApi/src/main/kotlin/Protocol.kt b/client/android/protocolApi/src/main/kotlin/Protocol.kt index e51d0fc1..a475a2fc 100644 --- a/client/android/protocolApi/src/main/kotlin/Protocol.kt +++ b/client/android/protocolApi/src/main/kotlin/Protocol.kt @@ -27,14 +27,21 @@ private const val SPLIT_TUNNEL_EXCLUDE = 2 abstract class Protocol { abstract val statistics: Statistics + protected lateinit var context: Context protected lateinit var state: MutableStateFlow protected lateinit var onError: (String) -> Unit + protected var isInitialized: Boolean = false - open fun initialize(context: Context, state: MutableStateFlow, onError: (String) -> Unit) { + fun initialize(context: Context, state: MutableStateFlow, onError: (String) -> Unit) { + this.context = context this.state = state this.onError = onError + internalInit() + isInitialized = true } + protected abstract fun internalInit() + abstract fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) abstract fun stopVpn() diff --git a/client/android/qt/build.gradle.kts b/client/android/qt/build.gradle.kts index 2ec2c941..139adf4f 100644 --- a/client/android/qt/build.gradle.kts +++ b/client/android/qt/build.gradle.kts @@ -21,5 +21,5 @@ android { } dependencies { - implementation(fileTree(mapOf("dir" to "../libs", "include" to listOf("*.jar", "*.aar")))) + implementation(fileTree(mapOf("dir" to "../libs", "include" to listOf("*.jar")))) } diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index d270731b..5cfc8314 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -36,6 +36,8 @@ include(":wireguard") include(":awg") include(":openvpn") include(":cloak") +include(":xray") +include(":xray:libXray") // get values from gradle or local properties val androidBuildToolsVersion: String by gradleProperties diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index c9063f22..202fe2e6 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.async import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -43,6 +44,8 @@ import org.amnezia.vpn.protocol.getStatus import org.amnezia.vpn.qt.QtAndroidController import org.amnezia.vpn.util.Log import org.amnezia.vpn.util.Prefs +import org.json.JSONException +import org.json.JSONObject import org.qtproject.qt.android.bindings.QtActivity private const val TAG = "AmneziaActivity" @@ -59,6 +62,7 @@ class AmneziaActivity : QtActivity() { private lateinit var mainScope: CoroutineScope private val qtInitialized = CompletableDeferred() + private var vpnProto: VpnProto? = null private var isWaitingStatus = true private var isServiceConnected = false private var isInBoundState = false @@ -141,6 +145,7 @@ class AmneziaActivity : QtActivity() { override fun onBindingDied(name: ComponentName?) { Log.w(TAG, "Binding to the ${name?.flattenToString()} unexpectedly died") doUnbindService() + QtAndroidController.onServiceDisconnected() doBindService() } } @@ -153,15 +158,20 @@ class AmneziaActivity : QtActivity() { super.onCreate(savedInstanceState) Log.d(TAG, "Create Amnezia activity: $intent") mainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + val proto = mainScope.async(Dispatchers.IO) { + VpnStateStore.getVpnState().vpnProto + } vpnServiceMessenger = IpcMessenger( "VpnService", onDeadObjectException = { doUnbindService() + QtAndroidController.onServiceDisconnected() doBindService() } ) registerBroadcastReceivers() intent?.let(::processIntent) + runBlocking { vpnProto = proto.await() } } private fun registerBroadcastReceivers() { @@ -209,13 +219,18 @@ class AmneziaActivity : QtActivity() { Log.d(TAG, "Start Amnezia activity") mainScope.launch { qtInitialized.await() - doBindService() + vpnProto?.let { proto -> + if (AmneziaVpnService.isRunning(applicationContext, proto.processName)) { + doBindService() + } + } } } override fun onStop() { Log.d(TAG, "Stop Amnezia activity") doUnbindService() + QtAndroidController.onServiceDisconnected() super.onStop() } @@ -269,10 +284,12 @@ class AmneziaActivity : QtActivity() { @MainThread private fun doBindService() { Log.d(TAG, "Bind service") - Intent(this, AmneziaVpnService::class.java).also { - bindService(it, serviceConnection, BIND_ABOVE_CLIENT and BIND_AUTO_CREATE) + vpnProto?.let { proto -> + Intent(this, proto.serviceClass).also { + bindService(it, serviceConnection, BIND_ABOVE_CLIENT and BIND_AUTO_CREATE) + } + isInBoundState = true } - isInBoundState = true } @MainThread @@ -280,7 +297,6 @@ class AmneziaActivity : QtActivity() { if (isInBoundState) { Log.d(TAG, "Unbind service") isWaitingStatus = true - QtAndroidController.onServiceDisconnected() isServiceConnected = false vpnServiceMessenger.send(Action.UNREGISTER_CLIENT, activityMessenger) vpnServiceMessenger.reset() @@ -365,13 +381,31 @@ class AmneziaActivity : QtActivity() { @MainThread private fun startVpn(vpnConfig: String) { - if (isServiceConnected) { - connectToVpn(vpnConfig) - } else { + getVpnProto(vpnConfig)?.let { proto -> + Log.d(TAG, "Proto from config: $proto, current proto: $vpnProto") + if (isServiceConnected) { + if (proto == vpnProto) { + connectToVpn(vpnConfig) + return + } + doUnbindService() + } + vpnProto = proto isWaitingStatus = false - startVpnService(vpnConfig) + startVpnService(vpnConfig, proto) doBindService() - } + } ?: QtAndroidController.onServiceError() + } + + private fun getVpnProto(vpnConfig: String): VpnProto? = try { + require(vpnConfig.isNotBlank()) { "Blank VPN config" } + VpnProto.get(JSONObject(vpnConfig).getString("protocol")) + } catch (e: JSONException) { + Log.e(TAG, "Invalid VPN config json format: ${e.message}") + null + } catch (e: IllegalArgumentException) { + Log.e(TAG, "Protocol not found: ${e.message}") + null } private fun connectToVpn(vpnConfig: String) { @@ -383,15 +417,15 @@ class AmneziaActivity : QtActivity() { } } - private fun startVpnService(vpnConfig: String) { - Log.d(TAG, "Start VPN service") - Intent(this, AmneziaVpnService::class.java).apply { + private fun startVpnService(vpnConfig: String, proto: VpnProto) { + Log.d(TAG, "Start VPN service: $proto") + Intent(this, proto.serviceClass).apply { putExtra(MSG_VPN_CONFIG, vpnConfig) }.also { try { ContextCompat.startForegroundService(this, it) } catch (e: SecurityException) { - Log.e(TAG, "Failed to start AmneziaVpnService: $e") + Log.e(TAG, "Failed to start ${proto.serviceClass.simpleName}: $e") QtAndroidController.onServiceError() } } diff --git a/client/android/src/org/amnezia/vpn/AmneziaTileService.kt b/client/android/src/org/amnezia/vpn/AmneziaTileService.kt index 1d13feac..32d5710d 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaTileService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaTileService.kt @@ -39,6 +39,9 @@ class AmneziaTileService : TileService() { @Volatile private var isServiceConnected = false + + @Volatile + private var vpnProto: VpnProto? = null private var isInBoundState = false @Volatile private var isVpnConfigExists = false @@ -94,16 +97,21 @@ class AmneziaTileService : TileService() { override fun onStartListening() { super.onStartListening() - Log.d(TAG, "Start listening") - if (AmneziaVpnService.isRunning(applicationContext)) { - Log.d(TAG, "Vpn service is running") - doBindService() - } else { - Log.d(TAG, "Vpn service is not running") - isServiceConnected = false - updateVpnState(DISCONNECTED) + scope.launch { + Log.d(TAG, "Start listening") + vpnProto = VpnStateStore.getVpnState().vpnProto + vpnProto.also { proto -> + if (proto != null && AmneziaVpnService.isRunning(applicationContext, proto.processName)) { + Log.d(TAG, "Vpn service is running") + doBindService() + } else { + Log.d(TAG, "Vpn service is not running") + isServiceConnected = false + updateVpnState(DISCONNECTED) + } + } + vpnStateListeningJob = launchVpnStateListening() } - vpnStateListeningJob = launchVpnStateListening() } override fun onStopListening() { @@ -124,7 +132,7 @@ class AmneziaTileService : TileService() { } private fun onClickInternal() { - if (isVpnConfigExists) { + if (isVpnConfigExists && vpnProto != null) { Log.d(TAG, "Change VPN state") if (qsTile.state == Tile.STATE_INACTIVE) { Log.d(TAG, "Start VPN") @@ -147,10 +155,12 @@ class AmneziaTileService : TileService() { private fun doBindService() { Log.d(TAG, "Bind service") - Intent(this, AmneziaVpnService::class.java).also { - bindService(it, serviceConnection, BIND_ABOVE_CLIENT) + vpnProto?.let { proto -> + Intent(this, proto.serviceClass).also { + bindService(it, serviceConnection, BIND_ABOVE_CLIENT) + } + isInBoundState = true } - isInBoundState = true } private fun doUnbindService() { @@ -180,6 +190,7 @@ class AmneziaTileService : TileService() { if (VpnService.prepare(applicationContext) != null) { Intent(this, VpnRequestActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + putExtra(EXTRA_PROTOCOL, vpnProto) }.also { startActivityAndCollapseCompat(it) } @@ -189,14 +200,16 @@ class AmneziaTileService : TileService() { } private fun startVpnService() { - try { - ContextCompat.startForegroundService( - applicationContext, - Intent(this, AmneziaVpnService::class.java) - ) - } catch (e: SecurityException) { - Log.e(TAG, "Failed to start AmneziaVpnService: $e") - } + vpnProto?.let { proto -> + try { + ContextCompat.startForegroundService( + applicationContext, + Intent(this, proto.serviceClass) + ) + } catch (e: SecurityException) { + Log.e(TAG, "Failed to start ${proto.serviceClass.simpleName}: $e") + } + } ?: Log.e(TAG, "Failed to start vpn service: vpnProto is null") } private fun connectToVpn() = vpnServiceMessenger.send(Action.CONNECT) @@ -220,11 +233,8 @@ class AmneziaTileService : TileService() { } } - private fun updateVpnState(state: ProtocolState) { - scope.launch { - VpnStateStore.store { it.copy(protocolState = state) } - } - } + private fun updateVpnState(state: ProtocolState) = + scope.launch { VpnStateStore.store { it.copy(protocolState = state) } } private fun launchVpnStateListening() = scope.launch { VpnStateStore.dataFlow().collectLatest(::updateTile) } @@ -232,9 +242,10 @@ class AmneziaTileService : TileService() { private fun updateTile(vpnState: VpnState) { Log.d(TAG, "Update tile: $vpnState") isVpnConfigExists = vpnState.serverName != null + vpnProto = vpnState.vpnProto val tile = qsTile ?: return tile.apply { - label = vpnState.serverName ?: DEFAULT_TILE_LABEL + label = (vpnState.serverName ?: DEFAULT_TILE_LABEL) + (vpnProto?.let { " ${it.label}" } ?: "") when (val protocolState = vpnState.protocolState) { CONNECTED -> { state = Tile.STATE_ACTIVE diff --git a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt index 89c53481..b30f1503 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaVpnService.kt @@ -1,5 +1,6 @@ package org.amnezia.vpn +import android.annotation.SuppressLint import android.app.ActivityManager import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE import android.app.NotificationManager @@ -39,7 +40,6 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import org.amnezia.vpn.protocol.BadConfigException import org.amnezia.vpn.protocol.LoadLibraryException -import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.ProtocolState.CONNECTED import org.amnezia.vpn.protocol.ProtocolState.CONNECTING import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED @@ -48,11 +48,7 @@ import org.amnezia.vpn.protocol.ProtocolState.RECONNECTING import org.amnezia.vpn.protocol.ProtocolState.UNKNOWN import org.amnezia.vpn.protocol.VpnException import org.amnezia.vpn.protocol.VpnStartException -import org.amnezia.vpn.protocol.awg.Awg -import org.amnezia.vpn.protocol.cloak.Cloak -import org.amnezia.vpn.protocol.openvpn.OpenVpn import org.amnezia.vpn.protocol.putStatus -import org.amnezia.vpn.protocol.wireguard.Wireguard import org.amnezia.vpn.util.Log import org.amnezia.vpn.util.Prefs import org.amnezia.vpn.util.net.NetworkState @@ -63,6 +59,7 @@ import org.json.JSONObject private const val TAG = "AmneziaVpnService" const val ACTION_DISCONNECT = "org.amnezia.vpn.action.disconnect" +const val ACTION_CONNECT = "org.amnezia.vpn.action.connect" const val MSG_VPN_CONFIG = "VPN_CONFIG" const val MSG_ERROR = "ERROR" @@ -73,19 +70,18 @@ const val AFTER_PERMISSION_CHECK = "AFTER_PERMISSION_CHECK" private const val PREFS_CONFIG_KEY = "LAST_CONF" private const val PREFS_SERVER_NAME = "LAST_SERVER_NAME" private const val PREFS_SERVER_INDEX = "LAST_SERVER_INDEX" -private const val PROCESS_NAME = "org.amnezia.vpn:amneziaVpnService" // private const val STATISTICS_SENDING_TIMEOUT = 1000L private const val TRAFFIC_STATS_UPDATE_TIMEOUT = 1000L private const val DISCONNECT_TIMEOUT = 5000L private const val STOP_SERVICE_TIMEOUT = 5000L -class AmneziaVpnService : VpnService() { +@SuppressLint("Registered") +open class AmneziaVpnService : VpnService() { private lateinit var mainScope: CoroutineScope private lateinit var connectionScope: CoroutineScope private var isServiceBound = false - private var protocol: Protocol? = null - private val protocolCache = mutableMapOf() + private var vpnProto: VpnProto? = null private var protocolState = MutableStateFlow(UNKNOWN) private var serverName: String? = null private var serverIndex: Int = -1 @@ -105,7 +101,7 @@ class AmneziaVpnService : VpnService() { // private var statisticsSendingJob: Job? = null private lateinit var networkState: NetworkState private lateinit var trafficStats: TrafficStats - private var disconnectReceiver: BroadcastReceiver? = null + private var controlReceiver: BroadcastReceiver? = null private var notificationStateReceiver: BroadcastReceiver? = null private var screenOnReceiver: BroadcastReceiver? = null private var screenOffReceiver: BroadcastReceiver? = null @@ -116,7 +112,6 @@ class AmneziaVpnService : VpnService() { private val connectionExceptionHandler = CoroutineExceptionHandler { _, e -> protocolState.value = DISCONNECTED - protocol = null when (e) { is IllegalArgumentException, is VpnStartException, @@ -227,7 +222,8 @@ class AmneziaVpnService : VpnService() { connect(intent?.getStringExtra(MSG_VPN_CONFIG)) } ServiceCompat.startForeground( - this, NOTIFICATION_ID, serviceNotification.buildNotification(serverName, protocolState.value), + this, NOTIFICATION_ID, + serviceNotification.buildNotification(serverName, vpnProto?.label, protocolState.value), foregroundServiceTypeCompat ) return START_REDELIVER_INTENT @@ -292,9 +288,17 @@ class AmneziaVpnService : VpnService() { private fun registerBroadcastReceivers() { Log.d(TAG, "Register broadcast receivers") - disconnectReceiver = registerBroadcastReceiver(ACTION_DISCONNECT, ContextCompat.RECEIVER_NOT_EXPORTED) { - Log.d(TAG, "Broadcast request received: $ACTION_DISCONNECT") - disconnect() + controlReceiver = registerBroadcastReceiver( + arrayOf(ACTION_CONNECT, ACTION_DISCONNECT), ContextCompat.RECEIVER_NOT_EXPORTED + ) { + it?.action?.let { action -> + Log.d(TAG, "Broadcast request received: $action") + when (action) { + ACTION_CONNECT -> connect() + ACTION_DISCONNECT -> disconnect() + else -> Log.w(TAG, "Unknown action received: $action") + } + } } notificationStateReceiver = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { @@ -340,10 +344,10 @@ class AmneziaVpnService : VpnService() { private fun unregisterBroadcastReceivers() { Log.d(TAG, "Unregister broadcast receivers") - unregisterBroadcastReceiver(disconnectReceiver) + unregisterBroadcastReceiver(controlReceiver) unregisterBroadcastReceiver(notificationStateReceiver) unregisterScreenStateBroadcastReceivers() - disconnectReceiver = null + controlReceiver = null notificationStateReceiver = null } @@ -356,7 +360,7 @@ class AmneziaVpnService : VpnService() { protocolState.drop(1).collect { protocolState -> Log.d(TAG, "Protocol state changed: $protocolState") - serviceNotification.updateNotification(serverName, protocolState) + serviceNotification.updateNotification(serverName, vpnProto?.label, protocolState) clientMessengers.send { ServiceEvent.STATUS_CHANGED.packToMessage { @@ -364,7 +368,7 @@ class AmneziaVpnService : VpnService() { } } - VpnStateStore.store { VpnState(protocolState, serverName, serverIndex) } + VpnStateStore.store { VpnState(protocolState, serverName, serverIndex, vpnProto) } when (protocolState) { CONNECTED -> { @@ -421,7 +425,7 @@ class AmneziaVpnService : VpnService() { @MainThread private fun enableNotification() { registerScreenStateBroadcastReceivers() - serviceNotification.updateNotification(serverName, protocolState.value) + serviceNotification.updateNotification(serverName, vpnProto?.label, protocolState.value) launchTrafficStatsUpdate() } @@ -484,8 +488,6 @@ class AmneziaVpnService : VpnService() { Log.d(TAG, "Start VPN connection") - protocolState.value = CONNECTING - val config = parseConfigToJson(vpnConfig) saveServerData(config) if (config == null) { @@ -494,6 +496,16 @@ class AmneziaVpnService : VpnService() { return } + try { + vpnProto = VpnProto.get(config.getString("protocol")) + } catch (e: Exception) { + onError("Invalid VPN config: ${e.message}") + protocolState.value = DISCONNECTED + return + } + + protocolState.value = CONNECTING + if (!checkPermission()) { protocolState.value = DISCONNECTED return @@ -503,8 +515,10 @@ class AmneziaVpnService : VpnService() { disconnectionJob?.join() disconnectionJob = null - protocol = getProtocol(config.getString("protocol")) - protocol?.startVpn(config, Builder(), ::protect) + vpnProto?.protocol?.let { protocol -> + protocol.initialize(applicationContext, protocolState, ::onError) + protocol.startVpn(config, Builder(), ::protect) + } } } @@ -520,8 +534,8 @@ class AmneziaVpnService : VpnService() { connectionJob?.join() connectionJob = null - protocol?.stopVpn() - protocol = null + vpnProto?.protocol?.stopVpn() + try { withTimeout(DISCONNECT_TIMEOUT) { // waiting for disconnect state @@ -543,22 +557,10 @@ class AmneziaVpnService : VpnService() { protocolState.value = RECONNECTING connectionJob = connectionScope.launch { - protocol?.reconnectVpn(Builder()) + vpnProto?.protocol?.reconnectVpn(Builder()) } } - @MainThread - private fun getProtocol(protocolName: String): Protocol = - protocolCache[protocolName] - ?: when (protocolName) { - "wireguard" -> Wireguard() - "awg" -> Awg() - "openvpn" -> OpenVpn() - "cloak" -> Cloak() - else -> throw IllegalArgumentException("Protocol '$protocolName' not found") - }.apply { initialize(applicationContext, protocolState, ::onError) } - .also { protocolCache[protocolName] = it } - /** * Utils methods */ @@ -603,6 +605,7 @@ class AmneziaVpnService : VpnService() { if (prepare(applicationContext) != null) { Intent(this, VpnRequestActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + putExtra(EXTRA_PROTOCOL, vpnProto) }.also { startActivity(it) } @@ -612,9 +615,9 @@ class AmneziaVpnService : VpnService() { } companion object { - fun isRunning(context: Context): Boolean = + fun isRunning(context: Context, processName: String): Boolean = context.getSystemService()!!.runningAppProcesses.any { - it.processName == PROCESS_NAME && it.importance <= IMPORTANCE_FOREGROUND_SERVICE + it.processName == processName && it.importance <= IMPORTANCE_FOREGROUND_SERVICE } } } diff --git a/client/android/src/org/amnezia/vpn/AwgService.kt b/client/android/src/org/amnezia/vpn/AwgService.kt new file mode 100644 index 00000000..ebdbe543 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/AwgService.kt @@ -0,0 +1,3 @@ +package org.amnezia.vpn + +class AwgService : AmneziaVpnService() diff --git a/client/android/src/org/amnezia/vpn/OpenVpnService.kt b/client/android/src/org/amnezia/vpn/OpenVpnService.kt new file mode 100644 index 00000000..72c8bab1 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/OpenVpnService.kt @@ -0,0 +1,3 @@ +package org.amnezia.vpn + +class OpenVpnService : AmneziaVpnService() diff --git a/client/android/src/org/amnezia/vpn/ServiceNotification.kt b/client/android/src/org/amnezia/vpn/ServiceNotification.kt index efdd04d3..f4707731 100644 --- a/client/android/src/org/amnezia/vpn/ServiceNotification.kt +++ b/client/android/src/org/amnezia/vpn/ServiceNotification.kt @@ -59,14 +59,14 @@ class ServiceNotification(private val context: Context) { formatSpeedString(rxString, txString) } - fun buildNotification(serverName: String?, state: ProtocolState): Notification { + fun buildNotification(serverName: String?, protocol: String?, state: ProtocolState): Notification { val speedString = if (state == CONNECTED) zeroSpeed else null Log.d(TAG, "Build notification: $serverName, $state") return notificationBuilder .setSmallIcon(R.drawable.ic_amnezia_round) - .setContentTitle(serverName ?: "AmneziaVPN") + .setContentTitle((serverName ?: "AmneziaVPN") + (protocol?.let { " $it" } ?: "")) .setContentText(context.getString(state)) .setSubText(speedString) .setWhen(System.currentTimeMillis()) @@ -96,10 +96,10 @@ class ServiceNotification(private val context: Context) { } @SuppressLint("MissingPermission") - fun updateNotification(serverName: String?, state: ProtocolState) { + fun updateNotification(serverName: String?, protocol: String?, state: ProtocolState) { if (context.isNotificationPermissionGranted()) { Log.d(TAG, "Update notification: $serverName, $state") - notificationManager.notify(NOTIFICATION_ID, buildNotification(serverName, state)) + notificationManager.notify(NOTIFICATION_ID, buildNotification(serverName, protocol, state)) } } @@ -125,7 +125,7 @@ class ServiceNotification(private val context: Context) { context, DISCONNECT_REQUEST_CODE, Intent(ACTION_DISCONNECT).apply { - setPackage("org.amnezia.vpn") + setPackage(context.packageName) }, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) @@ -135,10 +135,12 @@ class ServiceNotification(private val context: Context) { DISCONNECTED -> { Action( 0, context.getString(R.string.connect), - createServicePendingIntent( + PendingIntent.getBroadcast( context, CONNECT_REQUEST_CODE, - Intent(context, AmneziaVpnService::class.java), + Intent(ACTION_CONNECT).apply { + setPackage(context.packageName) + }, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) ) @@ -148,13 +150,6 @@ class ServiceNotification(private val context: Context) { } } - private val createServicePendingIntent: (Context, Int, Intent, Int) -> PendingIntent = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - PendingIntent::getForegroundService - } else { - PendingIntent::getService - } - companion object { fun createNotificationChannel(context: Context) { with(NotificationManagerCompat.from(context)) { diff --git a/client/android/src/org/amnezia/vpn/VpnProto.kt b/client/android/src/org/amnezia/vpn/VpnProto.kt new file mode 100644 index 00000000..508ce226 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/VpnProto.kt @@ -0,0 +1,67 @@ +package org.amnezia.vpn + +import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.awg.Awg +import org.amnezia.vpn.protocol.cloak.Cloak +import org.amnezia.vpn.protocol.openvpn.OpenVpn +import org.amnezia.vpn.protocol.wireguard.Wireguard +import org.amnezia.vpn.protocol.xray.Xray + +enum class VpnProto( + val label: String, + val processName: String, + val serviceClass: Class +) { + WIREGUARD( + "WireGuard", + "org.amnezia.vpn:amneziaAwgService", + AwgService::class.java + ) { + override fun createProtocol(): Protocol = Wireguard() + }, + + AWG( + "AmneziaWG", + "org.amnezia.vpn:amneziaAwgService", + AwgService::class.java + ) { + override fun createProtocol(): Protocol = Awg() + }, + + OPENVPN( + "OpenVPN", + "org.amnezia.vpn:amneziaOpenVpnService", + OpenVpnService::class.java + ) { + override fun createProtocol(): Protocol = OpenVpn() + }, + + CLOAK( + "Cloak", + "org.amnezia.vpn:amneziaOpenVpnService", + OpenVpnService::class.java + ) { + override fun createProtocol(): Protocol = Cloak() + }, + + XRAY( + "XRay", + "org.amnezia.vpn:amneziaXrayService", + XrayService::class.java + ) { + override fun createProtocol(): Protocol = Xray() + }; + + private var _protocol: Protocol? = null + val protocol: Protocol + get() { + if (_protocol == null) _protocol = createProtocol() + return _protocol ?: throw AssertionError("Set to null by another thread") + } + + protected abstract fun createProtocol(): Protocol + + companion object { + fun get(protocolName: String): VpnProto = VpnProto.valueOf(protocolName.uppercase()) + } +} \ No newline at end of file diff --git a/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt index 12d3fb3d..c24f5a19 100644 --- a/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt +++ b/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.content.res.Configuration.UI_MODE_NIGHT_MASK import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.net.VpnService +import android.os.Build import android.os.Bundle import android.provider.Settings import android.widget.Toast @@ -18,9 +19,11 @@ import androidx.core.content.getSystemService import org.amnezia.vpn.util.Log private const val TAG = "VpnRequestActivity" +const val EXTRA_PROTOCOL = "PROTOCOL" class VpnRequestActivity : ComponentActivity() { + private var vpnProto: VpnProto? = null private var userPresentReceiver: BroadcastReceiver? = null private val requestLauncher = registerForActivityResult(StartActivityForResult(), ::checkRequestResult) @@ -28,6 +31,12 @@ class VpnRequestActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d(TAG, "Start request activity") + vpnProto = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.extras?.getSerializable(EXTRA_PROTOCOL, VpnProto::class.java) + } else { + @Suppress("DEPRECATION") + intent.extras?.getSerializable(EXTRA_PROTOCOL) as VpnProto + } val requestIntent = VpnService.prepare(applicationContext) if (requestIntent != null) { if (getSystemService()!!.isKeyguardLocked) { @@ -66,10 +75,18 @@ class VpnRequestActivity : ComponentActivity() { private fun onPermissionGranted() { Toast.makeText(this, resources.getString(R.string.vpnGranted), Toast.LENGTH_LONG).show() - Intent(applicationContext, AmneziaVpnService::class.java).apply { - putExtra(AFTER_PERMISSION_CHECK, true) - }.also { - ContextCompat.startForegroundService(this, it) + vpnProto?.let { proto -> + Intent(applicationContext, proto.serviceClass).apply { + putExtra(AFTER_PERMISSION_CHECK, true) + }.also { + ContextCompat.startForegroundService(this, it) + } + } ?: run { + Intent(this, AmneziaActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + }.also { + startActivity(it) + } } } diff --git a/client/android/src/org/amnezia/vpn/VpnState.kt b/client/android/src/org/amnezia/vpn/VpnState.kt index fbc4ef59..94039dc1 100644 --- a/client/android/src/org/amnezia/vpn/VpnState.kt +++ b/client/android/src/org/amnezia/vpn/VpnState.kt @@ -1,19 +1,22 @@ package org.amnezia.vpn import android.app.Application +import androidx.datastore.core.CorruptionException import androidx.datastore.core.MultiProcessDataStoreFactory import androidx.datastore.core.Serializer +import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler import androidx.datastore.dataStoreFile -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream import java.io.InputStream -import java.io.ObjectInputStream -import java.io.ObjectOutputStream import java.io.OutputStream -import java.io.Serializable -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.withContext +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationException +import kotlinx.serialization.decodeFromByteArray +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf import org.amnezia.vpn.protocol.ProtocolState import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED import org.amnezia.vpn.util.Log @@ -21,13 +24,14 @@ import org.amnezia.vpn.util.Log private const val TAG = "VpnState" private const val STORE_FILE_NAME = "vpnState" +@Serializable data class VpnState( val protocolState: ProtocolState, val serverName: String? = null, - val serverIndex: Int = -1 -) : Serializable { + val serverIndex: Int = -1, + val vpnProto: VpnProto? = null +) { companion object { - private const val serialVersionUID: Long = -1760654961004181606 val defaultState: VpnState = VpnState(DISCONNECTED) } } @@ -37,7 +41,11 @@ object VpnStateStore { private val dataStore = MultiProcessDataStoreFactory.create( serializer = VpnStateSerializer(), - produceFile = { app.dataStoreFile(STORE_FILE_NAME) } + produceFile = { app.dataStoreFile(STORE_FILE_NAME) }, + corruptionHandler = ReplaceFileCorruptionHandler { e -> + Log.e(TAG, "VpnState DataStore corrupted: $e") + VpnState.defaultState + } ) fun init(app: Application) { @@ -45,36 +53,36 @@ object VpnStateStore { this.app = app } - fun dataFlow(): Flow = dataStore.data + fun dataFlow(): Flow = dataStore.data.catch { e -> + Log.e(TAG, "Failed to read VpnState from store: ${e.message}") + emit(VpnState.defaultState) + } + + suspend fun getVpnState(): VpnState = dataFlow().firstOrNull() ?: VpnState.defaultState suspend fun store(f: (vpnState: VpnState) -> VpnState) { try { dataStore.updateData(f) - } catch (e : Exception) { + } catch (e: Exception) { Log.e(TAG, "Failed to store VpnState: $e") + Log.w(TAG, "Remove DataStore file") + app.dataStoreFile(STORE_FILE_NAME).delete() } } } +@OptIn(ExperimentalSerializationApi::class) private class VpnStateSerializer : Serializer { override val defaultValue: VpnState = VpnState.defaultState - override suspend fun readFrom(input: InputStream): VpnState { - return withContext(Dispatchers.IO) { - val bios = ByteArrayInputStream(input.readBytes()) - ObjectInputStream(bios).use { - it.readObject() as VpnState - } - } + override suspend fun readFrom(input: InputStream): VpnState = try { + ProtoBuf.decodeFromByteArray(input.readBytes()) + } catch (e: SerializationException) { + Log.e(TAG, "Failed to deserialize data: $e") + throw CorruptionException("Failed to deserialize data", e) } - override suspend fun writeTo(t: VpnState, output: OutputStream) { - withContext(Dispatchers.IO) { - val baos = ByteArrayOutputStream() - ObjectOutputStream(baos).use { - it.writeObject(t) - } - output.write(baos.toByteArray()) - } - } + @Suppress("BlockingMethodInNonBlockingContext") + override suspend fun writeTo(t: VpnState, output: OutputStream) = + output.write(ProtoBuf.encodeToByteArray(t)) } diff --git a/client/android/src/org/amnezia/vpn/XrayService.kt b/client/android/src/org/amnezia/vpn/XrayService.kt new file mode 100644 index 00000000..2efcb4c9 --- /dev/null +++ b/client/android/src/org/amnezia/vpn/XrayService.kt @@ -0,0 +1,3 @@ +package org.amnezia.vpn + +class XrayService : AmneziaVpnService() diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt index 09482918..690510eb 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt @@ -1,12 +1,9 @@ package org.amnezia.vpn.protocol.wireguard -import android.content.Context import android.net.VpnService.Builder import java.util.TreeMap -import kotlinx.coroutines.flow.MutableStateFlow import org.amnezia.awg.GoBackend import org.amnezia.vpn.protocol.Protocol -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.Statistics @@ -78,9 +75,8 @@ open class Wireguard : Protocol() { } } - override fun initialize(context: Context, state: MutableStateFlow, onError: (String) -> Unit) { - super.initialize(context, state, onError) - loadSharedLibrary(context, "wg-go") + override fun internalInit() { + if (!isInitialized) loadSharedLibrary(context, "wg-go") } override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { diff --git a/client/android/xray/build.gradle.kts b/client/android/xray/build.gradle.kts new file mode 100644 index 00000000..f21a12a3 --- /dev/null +++ b/client/android/xray/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.protocol.xray" +} + +dependencies { + compileOnly(project(":utils")) + compileOnly(project(":protocolApi")) + implementation(project(":xray:libXray")) + implementation(libs.kotlinx.coroutines) +} diff --git a/client/android/xray/libXray/build.gradle.kts b/client/android/xray/libXray/build.gradle.kts new file mode 100644 index 00000000..99b9db36 --- /dev/null +++ b/client/android/xray/libXray/build.gradle.kts @@ -0,0 +1,6 @@ +@file:Suppress("UnstableApiUsage") + +configurations { + maybeCreate("default") +} +artifacts.add("default", file("libxray.aar")) diff --git a/client/android/xray/src/main/kotlin/Xray.kt b/client/android/xray/src/main/kotlin/Xray.kt new file mode 100644 index 00000000..b4d0b51f --- /dev/null +++ b/client/android/xray/src/main/kotlin/Xray.kt @@ -0,0 +1,237 @@ +package org.amnezia.vpn.protocol.xray + +import android.content.Context +import android.net.VpnService.Builder +import java.io.File +import java.io.IOException +import go.Seq +import org.amnezia.vpn.protocol.Protocol +import org.amnezia.vpn.protocol.ProtocolState.CONNECTED +import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED +import org.amnezia.vpn.protocol.Statistics +import org.amnezia.vpn.protocol.VpnStartException +import org.amnezia.vpn.protocol.xray.libXray.DialerController +import org.amnezia.vpn.protocol.xray.libXray.LibXray +import org.amnezia.vpn.protocol.xray.libXray.Logger +import org.amnezia.vpn.protocol.xray.libXray.Tun2SocksConfig +import org.amnezia.vpn.util.Log +import org.amnezia.vpn.util.net.InetNetwork +import org.amnezia.vpn.util.net.parseInetAddress +import org.json.JSONObject + +/** + * Config example: + * { + * "appSplitTunnelType": 0, + * "config_version": 0, + * "description": "Server 1", + * "dns1": "1.1.1.1", + * "dns2": "1.0.0.1", + * "hostName": "100.100.100.0", + * "protocol": "xray", + * "splitTunnelApps": [], + * "splitTunnelSites": [], + * "splitTunnelType": 0, + * "xray_config_data": { + * "inbounds": [ + * { + * "listen": "127.0.0.1", + * "port": 8080, + * "protocol": "socks", + * "settings": { + * "udp": true + * } + * } + * ], + * "log": { + * "loglevel": "error" + * }, + * "outbounds": [ + * { + * "protocol": "vless", + * "settings": { + * "vnext": [ + * { + * "address": "100.100.100.0", + * "port": 443, + * "users": [ + * { + * "encryption": "none", + * "flow": "xtls-rprx-vision", + * "id": "id" + * } + * ] + * } + * ] + * }, + * "streamSettings": { + * "network": "tcp", + * "realitySettings": { + * "fingerprint": "chrome", + * "publicKey": "publicKey", + * "serverName": "google.com", + * "shortId": "id", + * "spiderX": "" + * }, + * "security": "reality" + * } + * } + * ] + * } + * } + * + */ + +private const val TAG = "Xray" +private const val LIBXRAY_TAG = "libXray" + +class Xray : Protocol() { + + private var isRunning: Boolean = false + override val statistics: Statistics = Statistics.EMPTY_STATISTICS + + override fun internalInit() { + Seq.setContext(context) + if (!isInitialized) { + LibXray.initLogger(object : Logger { + override fun warning(s: String) = Log.w(LIBXRAY_TAG, s) + + override fun error(s: String) = Log.e(LIBXRAY_TAG, s) + + override fun write(msg: ByteArray): Long { + Log.w(LIBXRAY_TAG, String(msg)) + return msg.size.toLong() + } + }).isNotNullOrBlank { err -> + Log.w(TAG, "Failed to initialize logger: $err") + } + } + } + + override fun startVpn(config: JSONObject, vpnBuilder: Builder, protect: (Int) -> Boolean) { + if (isRunning) { + Log.w(TAG, "XRay already running") + return + } + + val xrayJsonConfig = config.getJSONObject("xray_config_data") + val xrayConfig = parseConfig(config, xrayJsonConfig) + + // for debug + // xrayJsonConfig.getJSONObject("log").put("loglevel", "debug") + xrayJsonConfig.getJSONObject("log").put("loglevel", "warning") + // disable access log + xrayJsonConfig.getJSONObject("log").put("access", "none") + + // replace socks address + // (xrayJsonConfig.getJSONArray("inbounds")[0] as JSONObject).put("listen", "::1") + + start(xrayConfig, xrayJsonConfig.toString(), vpnBuilder, protect) + state.value = CONNECTED + isRunning = true + } + + private fun parseConfig(config: JSONObject, xrayJsonConfig: JSONObject): XrayConfig { + return XrayConfig.build { + addAddress(XrayConfig.DEFAULT_IPV4_ADDRESS) + + config.optString("dns1").let { + if (it.isNotBlank()) addDnsServer(parseInetAddress(it)) + } + + config.optString("dns2").let { + if (it.isNotBlank()) addDnsServer(parseInetAddress(it)) + } + + addRoute(InetNetwork("0.0.0.0", 0)) + addRoute(InetNetwork("2000::0", 3)) + config.getString("hostName").let { + excludeRoute(InetNetwork(it, 32)) + } + + config.optString("mtu").let { + if (it.isNotBlank()) setMtu(it.toInt()) + } + + val socksConfig = xrayJsonConfig.getJSONArray("inbounds")[0] as JSONObject + socksConfig.getInt("port").let { setSocksPort(it) } + + configSplitTunneling(config) + configAppSplitTunneling(config) + } + } + + private fun start(config: XrayConfig, configJson: String, vpnBuilder: Builder, protect: (Int) -> Boolean) { + buildVpnInterface(config, vpnBuilder) + + DialerController { protect(it.toInt()) }.also { + LibXray.registerDialerController(it).isNotNullOrBlank { err -> + throw VpnStartException("Failed to register dialer controller: $err") + } + LibXray.registerListenerController(it).isNotNullOrBlank { err -> + throw VpnStartException("Failed to register listener controller: $err") + } + } + + vpnBuilder.establish().use { tunFd -> + if (tunFd == null) { + throw VpnStartException("Create VPN interface: permission not granted or revoked") + } + Log.d(TAG, "Run tun2Socks") + runTun2Socks(config, tunFd.detachFd()) + + Log.d(TAG, "Run XRay") + Log.i(TAG, "xray ${LibXray.xrayVersion()}") + val assetsPath = context.getDir("assets", Context.MODE_PRIVATE).absolutePath + LibXray.initXray(assetsPath) + val geoDir = File(assetsPath, "geo").absolutePath + val configPath = File(context.cacheDir, "config.json") + Log.d(TAG, "xray.location.asset: $geoDir") + Log.d(TAG, "config: $configPath") + try { + configPath.writeText(configJson) + } catch (e: IOException) { + LibXray.stopTun2Socks() + throw VpnStartException("Failed to write xray config: ${e.message}") + } + LibXray.runXray(geoDir, configPath.absolutePath, config.maxMemory).isNotNullOrBlank { err -> + LibXray.stopTun2Socks() + throw VpnStartException("Failed to start xray: $err") + } + } + } + + override fun stopVpn() { + LibXray.stopXray().isNotNullOrBlank { err -> + Log.e(TAG, "Failed to stop XRay: $err") + } + LibXray.stopTun2Socks().isNotNullOrBlank { err -> + Log.e(TAG, "Failed to stop tun2Socks: $err") + } + + isRunning = false + state.value = DISCONNECTED + } + + override fun reconnectVpn(vpnBuilder: Builder) { + state.value = CONNECTED + } + + private fun runTun2Socks(config: XrayConfig, fd: Int) { + val tun2SocksConfig = Tun2SocksConfig().apply { + mtu = config.mtu.toLong() + proxy = "socks5://127.0.0.1:${config.socksPort}" + device = "fd://$fd" + logLevel = "warning" + } + LibXray.startTun2Socks(tun2SocksConfig, fd.toLong()).isNotNullOrBlank { err -> + throw VpnStartException("Failed to start tun2socks: $err") + } + } +} + +private fun String?.isNotNullOrBlank(block: (String) -> Unit) { + if (!this.isNullOrBlank()) { + block(this) + } +} diff --git a/client/android/xray/src/main/kotlin/XrayConfig.kt b/client/android/xray/src/main/kotlin/XrayConfig.kt new file mode 100644 index 00000000..821a1c2f --- /dev/null +++ b/client/android/xray/src/main/kotlin/XrayConfig.kt @@ -0,0 +1,42 @@ +package org.amnezia.vpn.protocol.xray + +import org.amnezia.vpn.protocol.ProtocolConfig +import org.amnezia.vpn.util.net.InetNetwork + +private const val XRAY_DEFAULT_MTU = 1500 +private const val XRAY_DEFAULT_MAX_MEMORY: Long = 50 shl 20 // 50 MB + +class XrayConfig protected constructor( + protocolConfigBuilder: ProtocolConfig.Builder, + val socksPort: Int, + val maxMemory: Long, +) : ProtocolConfig(protocolConfigBuilder) { + + protected constructor(builder: Builder) : this( + builder, + builder.socksPort, + builder.maxMemory + ) + + class Builder : ProtocolConfig.Builder(false) { + internal var socksPort: Int = 0 + private set + + internal var maxMemory: Long = XRAY_DEFAULT_MAX_MEMORY + private set + + override var mtu: Int = XRAY_DEFAULT_MTU + + fun setSocksPort(port: Int) = apply { socksPort = port } + + fun setMaxMemory(maxMemory: Long) = apply { this.maxMemory = maxMemory } + + override fun build(): XrayConfig = configBuild().run { XrayConfig(this@Builder) } + } + + companion object { + internal val DEFAULT_IPV4_ADDRESS: InetNetwork = InetNetwork("10.0.42.2", 30) + + inline fun build(block: Builder.() -> Unit): XrayConfig = Builder().apply(block).build() + } +} diff --git a/client/cmake/android.cmake b/client/cmake/android.cmake index c39642ff..13c357bd 100644 --- a/client/cmake/android.cmake +++ b/client/cmake/android.cmake @@ -52,3 +52,6 @@ foreach(abi IN ITEMS ${QT_ANDROID_ABIS}) ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/libssh/android/${abi}/libssh.so ) endforeach() + +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/xray/android/libxray.aar + DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/android/xray/libXray) diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index 3c2a3861..8276bc93 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -305,6 +305,7 @@ bool ContainerProps::isSupportedByCurrentPlatform(DockerContainer c) case DockerContainer::ShadowSocks: return false; case DockerContainer::Awg: return true; case DockerContainer::Cloak: return true; + case DockerContainer::Xray: return true; default: return false; }