Skip to content

Commit

Permalink
Merge pull request #645 from Chilledheart/ios_refuse_to_connect_for_n…
Browse files Browse the repository at this point in the history
…etwork_unreachable_error

Ios refuse to connect for network unreachable error
  • Loading branch information
Chilledheart committed Jan 11, 2024
2 parents 2e1d71e + de2c1df commit caf49d4
Show file tree
Hide file tree
Showing 17 changed files with 188 additions and 195 deletions.
9 changes: 6 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3867,8 +3867,11 @@ if (GUI)

target_compile_options(${APP_NAME} PRIVATE ${GUI_C_CXX_FLAGS})

if (NOT IOS)
target_link_libraries(${APP_NAME} PUBLIC yass_cli_lib)
endif()

target_link_libraries(${APP_NAME} PUBLIC
yass_cli_lib
${GUI_LIBRARIES}
yass_base
)
Expand Down Expand Up @@ -4166,8 +4169,8 @@ if (GUI)
find_library(NetworkExtension_LIBRARY NetworkExtension REQUIRED)

set(PLUGIN_SRC
src/ios/tun2proxy.h
src/ios/tun2proxy.mm
src/ios/extensions/tun2proxy.h
src/ios/extensions/tun2proxy.mm
src/ios/extensions/YassPacketTunnelProvider.h
src/ios/extensions/YassPacketTunnelProvider.mm
src/ios/extensions/PacketTunnel.entitlements
Expand Down
6 changes: 3 additions & 3 deletions src/android/jni.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ CIPHER_METHOD_VALID_MAP(XX)
std::string timeout = timeout_str != nullptr ? timeout_str : std::string();
env->ReleaseStringUTFChars((jstring)_timeout, timeout_str);

std::string err_msg = Worker::SaveConfig(server_host, server_sni, server_port,
username, password, method,
local_host, local_port, timeout);
std::string err_msg = config::ReadConfigFromArgument(server_host, server_sni, server_port,
username, password, method,
local_host, local_port, timeout);

if (err_msg.empty()) {
return nullptr;
Expand Down
126 changes: 0 additions & 126 deletions src/cli/cli_worker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,11 @@
#include <absl/strings/str_cat.h>
#include <absl/strings/str_join.h>
#include <openssl/crypto.h>
#include <sstream>

#ifdef _WIN32
#include <ws2tcpip.h>
#endif

#ifndef _POSIX_HOST_NAME_MAX
#define _POSIX_HOST_NAME_MAX 255
#endif

using namespace cli;

class WorkerPrivate {
Expand Down Expand Up @@ -162,127 +157,6 @@ int Worker::GetLocalPort() const {
return local_port_;
}

std::string
Worker::SaveConfig(const std::string& server_host,
const std::string& server_sni,
const std::string& _server_port,
const std::string& username,
const std::string& password,
cipher_method method,
const std::string& local_host,
const std::string& _local_port,
const std::string& _timeout) {
std::ostringstream err_msg;

if (server_host.empty() || server_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_host;
}

if (server_sni.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_sni;
}

auto server_port = StringToIntegerU(_server_port);
if (!server_port.has_value() || server_port.value() > 65535u) {
err_msg << ",Invalid Server Port: " << _server_port;
}

if (method == CRYPTO_INVALID) {
err_msg << ",Invalid Cipher: " << to_cipher_method_str(method);
}

if (local_host.empty() || local_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Local Host: " << local_host;
}

auto local_port = StringToIntegerU(_local_port);
if (!local_port.has_value() || local_port.value() > 65535u) {
err_msg << ",Invalid Local Port: " << _local_port;
}

auto timeout = StringToIntegerU(_timeout);
if (!timeout.has_value()) {
err_msg << ",Invalid Connect Timeout: " << _timeout;
}

std::string ret = err_msg.str();
if (ret.empty()) {
absl::SetFlag(&FLAGS_server_host, server_host);
absl::SetFlag(&FLAGS_server_sni, server_sni);
absl::SetFlag(&FLAGS_server_port, server_port.value());
absl::SetFlag(&FLAGS_username, username);
absl::SetFlag(&FLAGS_password, password);
absl::SetFlag(&FLAGS_method, method);
absl::SetFlag(&FLAGS_local_host, local_host);
absl::SetFlag(&FLAGS_local_port, local_port.value());
absl::SetFlag(&FLAGS_connect_timeout, timeout.value());
} else {
ret = ret.substr(1);
}
return ret;
}

std::string
Worker::SaveConfig(const std::string& server_host,
const std::string& server_sni,
const std::string& _server_port,
const std::string& username,
const std::string& password,
const std::string& method_string,
const std::string& local_host,
const std::string& _local_port,
const std::string& _timeout) {
std::ostringstream err_msg;

if (server_host.empty() || server_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_host;
}

if (server_sni.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_sni;
}

auto server_port = StringToIntegerU(_server_port);
if (!server_port.has_value() || server_port.value() > 65535u) {
err_msg << ",Invalid Server Port: " << _server_port;
}

auto method = to_cipher_method(method_string);
if (method == CRYPTO_INVALID) {
err_msg << ",Invalid Cipher: " << method_string;
}

if (local_host.empty() || local_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Local Host: " << local_host;
}

auto local_port = StringToIntegerU(_local_port);
if (!local_port.has_value() || local_port.value() > 65535u) {
err_msg << ",Invalid Local Port: " << _local_port;
}

auto timeout = StringToIntegerU(_timeout);
if (!timeout.has_value()) {
err_msg << ",Invalid Connect Timeout: " << _timeout;
}

std::string ret = err_msg.str();
if (ret.empty()) {
absl::SetFlag(&FLAGS_server_host, server_host);
absl::SetFlag(&FLAGS_server_sni, server_sni);
absl::SetFlag(&FLAGS_server_port, server_port.value());
absl::SetFlag(&FLAGS_username, username);
absl::SetFlag(&FLAGS_password, password);
absl::SetFlag(&FLAGS_method, method);
absl::SetFlag(&FLAGS_local_host, local_host);
absl::SetFlag(&FLAGS_local_port, local_port.value());
absl::SetFlag(&FLAGS_connect_timeout, timeout.value());
} else {
ret = ret.substr(1);
}
return ret;
}

void Worker::WorkFunc() {
LOG(INFO) << "background thread started";
while (!in_destroy_) {
Expand Down
23 changes: 0 additions & 23 deletions src/cli/cli_worker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,29 +37,6 @@ class Worker {

size_t currentConnections() const;

public:
static
std::string SaveConfig(const std::string& server_host,
const std::string& server_sni,
const std::string& server_port,
const std::string& username,
const std::string& password,
cipher_method method,
const std::string& local_host,
const std::string& local_port,
const std::string& connect_timeout);

static
std::string SaveConfig(const std::string& server_host,
const std::string& server_sni,
const std::string& server_port,
const std::string& username,
const std::string& password,
const std::string& method_string,
const std::string& local_host,
const std::string& local_port,
const std::string& connect_timeout);

private:
void WorkFunc();

Expand Down
127 changes: 127 additions & 0 deletions src/config/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,14 @@
#include <absl/flags/internal/program_name.h>

#include "core/cipher.hpp"
#include "core/utils.hpp"
#include "feature.h"
#include "version.h"

#ifndef _POSIX_HOST_NAME_MAX
#define _POSIX_HOST_NAME_MAX 255
#endif

bool AbslParseFlag(absl::string_view text, CipherMethodFlag* flag,
std::string* err);

Expand Down Expand Up @@ -392,4 +397,126 @@ bool SaveConfig() {
return all_fields_written;
}

std::string
ReadConfigFromArgument(const std::string& server_host,
const std::string& server_sni,
const std::string& _server_port,
const std::string& username,
const std::string& password,
cipher_method method,
const std::string& local_host,
const std::string& _local_port,
const std::string& _timeout) {
std::ostringstream err_msg;

if (server_host.empty() || server_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_host;
}

if (server_sni.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_sni;
}

auto server_port = StringToIntegerU(_server_port);
if (!server_port.has_value() || server_port.value() > 65535u) {
err_msg << ",Invalid Server Port: " << _server_port;
}

if (method == CRYPTO_INVALID) {
err_msg << ",Invalid Cipher: " << to_cipher_method_str(method);
}

if (local_host.empty() || local_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Local Host: " << local_host;
}

auto local_port = StringToIntegerU(_local_port);
if (!local_port.has_value() || local_port.value() > 65535u) {
err_msg << ",Invalid Local Port: " << _local_port;
}

auto timeout = StringToIntegerU(_timeout);
if (!timeout.has_value()) {
err_msg << ",Invalid Connect Timeout: " << _timeout;
}

std::string ret = err_msg.str();
if (ret.empty()) {
absl::SetFlag(&FLAGS_server_host, server_host);
absl::SetFlag(&FLAGS_server_sni, server_sni);
absl::SetFlag(&FLAGS_server_port, server_port.value());
absl::SetFlag(&FLAGS_username, username);
absl::SetFlag(&FLAGS_password, password);
absl::SetFlag(&FLAGS_method, method);
absl::SetFlag(&FLAGS_local_host, local_host);
absl::SetFlag(&FLAGS_local_port, local_port.value());
absl::SetFlag(&FLAGS_connect_timeout, timeout.value());
} else {
ret = ret.substr(1);
}
return ret;
}

std::string
ReadConfigFromArgument(const std::string& server_host,
const std::string& server_sni,
const std::string& _server_port,
const std::string& username,
const std::string& password,
const std::string& method_string,
const std::string& local_host,
const std::string& _local_port,
const std::string& _timeout) {
std::ostringstream err_msg;

if (server_host.empty() || server_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_host;
}

if (server_sni.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Server Host: " << server_sni;
}

auto server_port = StringToIntegerU(_server_port);
if (!server_port.has_value() || server_port.value() > 65535u) {
err_msg << ",Invalid Server Port: " << _server_port;
}

auto method = to_cipher_method(method_string);
if (method == CRYPTO_INVALID) {
err_msg << ",Invalid Cipher: " << method_string;
}

if (local_host.empty() || local_host.size() >= _POSIX_HOST_NAME_MAX) {
err_msg << ",Invalid Local Host: " << local_host;
}

auto local_port = StringToIntegerU(_local_port);
if (!local_port.has_value() || local_port.value() > 65535u) {
err_msg << ",Invalid Local Port: " << _local_port;
}

auto timeout = StringToIntegerU(_timeout);
if (!timeout.has_value()) {
err_msg << ",Invalid Connect Timeout: " << _timeout;
}

std::string ret = err_msg.str();
if (ret.empty()) {
absl::SetFlag(&FLAGS_server_host, server_host);
absl::SetFlag(&FLAGS_server_sni, server_sni);
absl::SetFlag(&FLAGS_server_port, server_port.value());
absl::SetFlag(&FLAGS_username, username);
absl::SetFlag(&FLAGS_password, password);
absl::SetFlag(&FLAGS_method, method);
absl::SetFlag(&FLAGS_local_host, local_host);
absl::SetFlag(&FLAGS_local_port, local_port.value());
absl::SetFlag(&FLAGS_connect_timeout, timeout.value());
} else {
ret = ret.substr(1);
}
return ret;
}


} // namespace config
20 changes: 20 additions & 0 deletions src/config/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ namespace config {
void ReadConfigFileOption(int argc, const char** argv);
bool ReadConfig();
bool SaveConfig();

std::string ReadConfigFromArgument(const std::string& server_host,
const std::string& server_sni,
const std::string& server_port,
const std::string& username,
const std::string& password,
cipher_method method,
const std::string& local_host,
const std::string& local_port,
const std::string& connect_timeout);

std::string ReadConfigFromArgument(const std::string& server_host,
const std::string& server_sni,
const std::string& server_port,
const std::string& username,
const std::string& password,
const std::string& method_string,
const std::string& local_host,
const std::string& local_port,
const std::string& connect_timeout);
} // namespace config

#endif // H_CONFIG_CONFIG
8 changes: 4 additions & 4 deletions src/gtk/yass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,8 +291,8 @@ std::string YASSApp::SaveConfig() {
auto local_port = main_window_->GetLocalPort();
auto connect_timeout = main_window_->GetTimeout();

return Worker::SaveConfig(server_host, server_sni, server_port,
username, password, method_string,
local_host, local_port,
connect_timeout);
return config::ReadConfigFromArgument(server_host, server_sni, server_port,
username, password, method_string,
local_host, local_port,
connect_timeout);
}
Loading

0 comments on commit caf49d4

Please sign in to comment.