fix bug crash when run
This commit is contained in:
parent
5b663f6397
commit
c88150e059
7 changed files with 57 additions and 114 deletions
|
|
@ -270,6 +270,30 @@ bool AmneziaApplication::parseCommands()
|
|||
QCommandLineOption c_cleanup { { "c", "cleanup" }, "Cleanup logs" };
|
||||
m_parser.addOption(c_cleanup);
|
||||
|
||||
#if defined(MACOS_NE)
|
||||
// Handle positional arguments for MacOS NE
|
||||
QStringList rawArgs = arguments(); // Get the full list of arguments
|
||||
QStringList positionalArgs;
|
||||
|
||||
for (int i = 1; i < rawArgs.size(); ++i) {
|
||||
if (!rawArgs[i].startsWith("-")) {
|
||||
positionalArgs << rawArgs[i]; // Collect non-option arguments
|
||||
}
|
||||
}
|
||||
|
||||
if (!positionalArgs.isEmpty()) {
|
||||
QString mode = positionalArgs.first();
|
||||
qInfo() << "Running in mode:" << mode;
|
||||
|
||||
if (mode == "DebugMode") {
|
||||
qInfo() << "Debug Mode activated for MacOS NE";
|
||||
// Do something specific for DebugMode
|
||||
} else {
|
||||
qWarning() << "Unknown mode for MacOS NE:" << mode;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
m_parser.process(*this);
|
||||
|
||||
if (m_parser.isSet(c_cleanup)) {
|
||||
|
|
|
|||
|
|
@ -27,9 +27,9 @@ if(WIN32)
|
|||
set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/windows/win32/libcrypto.lib")
|
||||
endif()
|
||||
elseif(APPLE AND NOT IOS)
|
||||
set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/x86_64/libssh.a")
|
||||
set(ZLIB_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/x86_64/libz.a")
|
||||
set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/macos/x86_64")
|
||||
set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/arm64_x86_64/libssh.a")
|
||||
set(ZLIB_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/arm64_x86_64/libz.a")
|
||||
set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/macos/arm64_x86_64")
|
||||
set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/macos/include")
|
||||
set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libssl.a")
|
||||
set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/macos/lib/libcrypto.a")
|
||||
|
|
|
|||
|
|
@ -84,12 +84,12 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
|
||||
XCODE_EMBED_APP_EXTENSIONS networkextension
|
||||
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development: TRAN VIET ANH (Y372SYT4WL)"
|
||||
# XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN"
|
||||
# XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "org.amnezia.AmneziaVPNManual"
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development: TRAN VIET ANH (Y372SYT4WL)"
|
||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN"
|
||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "org.amnezia.AmneziaVPNManual"
|
||||
)
|
||||
set_target_properties(${PROJECT} PROPERTIES
|
||||
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
||||
|
|
|
|||
|
|
@ -29,13 +29,12 @@ set_target_properties(networkextension PROPERTIES
|
|||
XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
|
||||
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
||||
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||
# XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore network-extension"
|
||||
# XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "amnezia.AmneziaVPN.network-extensionManual"
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development: TRAN VIET ANH (Y372SYT4WL)"
|
||||
|
||||
# XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore network-extension"
|
||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "amnezia.AmneziaVPN.network-extensionManual"
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)"
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development: TRAN VIET ANH (Y372SYT4WL)"
|
||||
|
||||
XCODE_ATTRIBUTE_INFOPLIST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
|
||||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks"
|
||||
|
|
@ -130,7 +129,7 @@ target_sources(networkextension PRIVATE
|
|||
target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR})
|
||||
target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/macos/x86_64/libwg-go.a)
|
||||
target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/macos/arm64_x86_64/libwg-go.a)
|
||||
|
||||
message(${CLIENT_ROOT_DIR})
|
||||
message(${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a)
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ extension PacketTunnelProvider {
|
|||
if let lastHandshakeValue = lastHandshakeString, let handshakeValue = Int64(lastHandshakeValue) {
|
||||
lastHandshake = handshakeValue
|
||||
} else {
|
||||
lastHandshake = -2
|
||||
lastHandshake = -2 // Trả về lỗi nếu không có giá trị last_handshake_time_sec
|
||||
}
|
||||
|
||||
let response: [String: Any] = [
|
||||
|
|
|
|||
|
|
@ -56,9 +56,6 @@ public:
|
|||
QString openFile();
|
||||
|
||||
void requestInetAccess();
|
||||
|
||||
void stopForHandshake();
|
||||
void waitForHandshake();
|
||||
signals:
|
||||
void connectionStateChanged(Vpn::ConnectionState state);
|
||||
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#include <QJsonObject>
|
||||
#include <QThread>
|
||||
#include <QEventLoop>
|
||||
#include <QTimer>
|
||||
|
||||
#include "../protocols/vpnprotocol.h"
|
||||
#import "ios_controller_wrapper.h"
|
||||
|
||||
|
|
@ -60,8 +60,6 @@ Vpn::ConnectionState iosStatusToState(NEVPNStatus status) {
|
|||
|
||||
namespace {
|
||||
IosController* s_instance = nullptr;
|
||||
QTimer *m_handshakeTimer = nullptr;
|
||||
bool is_WireGuard = false;
|
||||
}
|
||||
|
||||
IosController::IosController() : QObject()
|
||||
|
|
@ -209,27 +207,21 @@ bool IosController::connectVpn(amnezia::Proto proto, const QJsonObject& configur
|
|||
|
||||
|
||||
if (proto == amnezia::Proto::OpenVpn) {
|
||||
is_WireGuard = false;
|
||||
return setupOpenVPN();
|
||||
}
|
||||
if (proto == amnezia::Proto::Cloak) {
|
||||
is_WireGuard = false;
|
||||
return setupCloak();
|
||||
}
|
||||
if (proto == amnezia::Proto::WireGuard) {
|
||||
is_WireGuard = true;
|
||||
return setupWireGuard();
|
||||
}
|
||||
if (proto == amnezia::Proto::Awg) {
|
||||
is_WireGuard = true;
|
||||
return setupAwg();
|
||||
}
|
||||
if (proto == amnezia::Proto::Xray) {
|
||||
is_WireGuard = false;
|
||||
return setupXray();
|
||||
}
|
||||
if (proto == amnezia::Proto::SSXray) {
|
||||
is_WireGuard = false;
|
||||
return setupSSXray();
|
||||
}
|
||||
|
||||
|
|
@ -260,98 +252,31 @@ void IosController::checkStatus()
|
|||
uint64_t txBytes = [response[@"tx_bytes"] intValue];
|
||||
uint64_t rxBytes = [response[@"rx_bytes"] intValue];
|
||||
|
||||
uint64_t last_handshake_time_sec = 0;
|
||||
if (response[@"last_handshake_time_sec"] && ![response[@"last_handshake_time_sec"] isKindOfClass:[NSNull class]]) {
|
||||
last_handshake_time_sec = [response[@"last_handshake_time_sec"] intValue];
|
||||
} else {
|
||||
qDebug() << "Key last_handshake_time_sec is missing or null";
|
||||
}
|
||||
|
||||
if (last_handshake_time_sec < 0) {
|
||||
disconnectVpn();
|
||||
qDebug() << "Invalid handshake time, disconnecting VPN.";
|
||||
}
|
||||
|
||||
emit bytesChanged(rxBytes - m_rxBytes, txBytes - m_txBytes);
|
||||
m_rxBytes = rxBytes;
|
||||
m_txBytes = txBytes;
|
||||
});
|
||||
}
|
||||
|
||||
void IosController::stopForHandshake() {
|
||||
if (m_handshakeTimer) {
|
||||
if (m_handshakeTimer->isActive()) {
|
||||
m_handshakeTimer->stop();
|
||||
}
|
||||
m_handshakeTimer->deleteLater();
|
||||
m_handshakeTimer = nullptr;
|
||||
|
||||
qDebug() << "Handshake monitoring stopped.";
|
||||
} else {
|
||||
qDebug() << "No active handshake monitoring to stop.";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void IosController::waitForHandshake() {
|
||||
qDebug() << "Waiting for last_handshake_time_sec to be greater than 0...";
|
||||
|
||||
// Initialize the timer if it's null
|
||||
if (!m_handshakeTimer) {
|
||||
m_handshakeTimer = new QTimer(this);
|
||||
|
||||
// Connect the timer's timeout signal to perform handshake checking
|
||||
connect(m_handshakeTimer, &QTimer::timeout, this, [this]() {
|
||||
// Prepare the message to check status
|
||||
NSString *actionKey = [NSString stringWithUTF8String:MessageKey::action];
|
||||
NSString *actionValue = [NSString stringWithUTF8String:Action::getStatus];
|
||||
NSString *tunnelIdKey = [NSString stringWithUTF8String:MessageKey::tunnelId];
|
||||
NSString *tunnelIdValue = !m_tunnelId.isEmpty() ? m_tunnelId.toNSString() : @"";
|
||||
|
||||
NSDictionary *message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue};
|
||||
|
||||
// Lambda to handle the response
|
||||
auto checkHandshake = [this](NSDictionary *response) {
|
||||
uint64_t last_handshake_time_sec = 0;
|
||||
if (response && response[@"last_handshake_time_sec"] &&
|
||||
![response[@"last_handshake_time_sec"] isKindOfClass:[NSNull class]]) {
|
||||
last_handshake_time_sec = [response[@"last_handshake_time_sec"] unsignedLongLongValue];
|
||||
}
|
||||
|
||||
qDebug() << "last_handshake_time_sec:" << last_handshake_time_sec;
|
||||
|
||||
if (last_handshake_time_sec > 0) {
|
||||
// Handshake successful, update state
|
||||
qDebug() << "Handshake detected, updating state to CONNECTED.";
|
||||
emit connectionStateChanged(Vpn::ConnectionState::Connected);
|
||||
stopForHandshake();
|
||||
return;
|
||||
} else {
|
||||
if (last_handshake_time_sec == 0) {
|
||||
// Keep retrying
|
||||
emit connectionStateChanged(Vpn::ConnectionState::Connecting);
|
||||
} else {
|
||||
// Handle handshake failure and stop monitoring
|
||||
emit connectionStateChanged(Vpn::ConnectionState::Disconnected);
|
||||
stopForHandshake();
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Send the message to the VPN extension
|
||||
sendVpnExtensionMessage(message, checkHandshake);
|
||||
});
|
||||
|
||||
qDebug() << "Handshake timer initialized.";
|
||||
}
|
||||
|
||||
// Start the timer only if it's not already active
|
||||
if (m_handshakeTimer && !m_handshakeTimer->isActive()) {
|
||||
m_handshakeTimer->start(1000); // Retry every 1 second
|
||||
qDebug() << "Handshake timer Retry every 1 second";
|
||||
}
|
||||
}
|
||||
|
||||
void IosController::vpnStatusDidChange(void *pNotification)
|
||||
{
|
||||
NETunnelProviderSession *session = (NETunnelProviderSession *)pNotification;
|
||||
|
||||
if (session /* && session == TunnelManager.session */ ) {
|
||||
qDebug() << "IosController::vpnStatusDidChange" << iosStatusToState(session.status) << session;
|
||||
if (is_WireGuard && session.status == NEVPNStatusConnected)
|
||||
{
|
||||
// use last_handshake_time
|
||||
return;
|
||||
}
|
||||
|
||||
if (session.status == NEVPNStatusDisconnected) {
|
||||
if (@available(iOS 16.0, *)) {
|
||||
[session fetchLastDisconnectErrorWithCompletionHandler:^(NSError * _Nullable error) {
|
||||
|
|
@ -446,7 +371,6 @@ void IosController::vpnStatusDidChange(void *pNotification)
|
|||
} else {
|
||||
qDebug() << "Disconnect error is unavailable on iOS < 16.0";
|
||||
}
|
||||
stopForHandshake();
|
||||
}
|
||||
|
||||
emit connectionStateChanged(iosStatusToState(session.status));
|
||||
|
|
@ -731,7 +655,7 @@ bool IosController::startWireGuard(const QString &config)
|
|||
tunnelProtocol.serverAddress = m_serverAddress;
|
||||
|
||||
m_currentTunnel.protocolConfiguration = tunnelProtocol;
|
||||
waitForHandshake();
|
||||
|
||||
startTunnel();
|
||||
}
|
||||
|
||||
|
|
@ -955,4 +879,3 @@ void IosController::requestInetAccess() {
|
|||
}];
|
||||
[task resume];
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue