diff --git a/.github/workflows/publish-nyms5-android-apk.yml b/.github/workflows/publish-nyms5-android-apk.yml index ab665ea660..b4518d57c3 100644 --- a/.github/workflows/publish-nyms5-android-apk.yml +++ b/.github/workflows/publish-nyms5-android-apk.yml @@ -56,14 +56,6 @@ jobs: rustup target add aarch64-linux-android \ x86_64-linux-android - - name: Build lib nym-socks5-listener - working-directory: sdk/lib/socks5-listener/ - env: - RELEASE: true - RUSTFLAGS: "-C link-args=-Wl,--hash-style=gnu" - # build for arm64 and x86_64 - run: ./build-android.sh aarch64 x86_64 - - name: Build APKs (unsigned) working-directory: nym-connect/native/android env: diff --git a/Cargo.lock b/Cargo.lock index 4b69324120..c7c85e0d9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,23 +140,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" -[[package]] -name = "android_log-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" - -[[package]] -name = "android_logger" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b07e8e73d720a1f2e4b6014766e6039fd2e96a4fa44e2a78d0e1fa2ff49826" -dependencies = [ - "android_log-sys", - "env_filter", - "log", -] - [[package]] name = "android_system_properties" version = "0.1.5" @@ -981,12 +964,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.0" @@ -1182,16 +1159,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "comfy-table" version = "7.1.1" @@ -2482,26 +2449,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "ext-trait" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d772df1c1a777963712fb68e014235e80863d6a91a85c4e06ba2d16243a310e5" -dependencies = [ - "ext-trait-proc_macros", -] - -[[package]] -name = "ext-trait-proc_macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab7934152eaf26aa5aa9f7371408ad5af4c31357073c9e84c3b9d7f11ad639a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "extension-storage" version = "1.3.0-rc.0" @@ -2518,21 +2465,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "extension-traits" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a296e5a895621edf9fa8329c83aa1cb69a964643e36cf54d8d7a69b789089537" -dependencies = [ - "ext-trait", -] - -[[package]] -name = "extern-c" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320bea982e85d42441eb25c49b41218e7eaa2657e8f90bc4eca7437376751e23" - [[package]] name = "eyre" version = "0.6.12" @@ -3730,28 +3662,6 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - [[package]] name = "js-sys" version = "0.3.72" @@ -3941,22 +3851,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "macro_rules_attribute" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf0c9b980bf4f3a37fd7b1c066941dd1b1d0152ce6ee6e8fe8c49b9f6810d862" -dependencies = [ - "macro_rules_attribute-proc_macro", - "paste", -] - -[[package]] -name = "macro_rules_attribute-proc_macro" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58093314a45e00c77d5c508f76e77c3396afbbc0d01506e7fae47b018bac2b1d" - [[package]] name = "macroific" version = "1.3.1" @@ -6394,28 +6288,6 @@ dependencies = [ "url", ] -[[package]] -name = "nym-socks5-listener" -version = "0.1.0" -dependencies = [ - "android_logger", - "anyhow", - "futures", - "jni", - "lazy_static", - "log", - "nym-bin-common", - "nym-client-core", - "nym-config", - "nym-credential-storage", - "nym-crypto", - "nym-socks5-client-core", - "rand", - "safer-ffi", - "serde", - "tokio", -] - [[package]] name = "nym-socks5-proxy-helpers" version = "0.1.0" @@ -7548,16 +7420,6 @@ dependencies = [ "log", ] -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -8455,38 +8317,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "safer-ffi" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435fdd58b61a6f1d8545274c1dfa458e905ff68c166e65e294a0130ef5e675bd" -dependencies = [ - "extern-c", - "inventory", - "libc", - "macro_rules_attribute", - "paste", - "safer_ffi-proc_macros", - "scopeguard", - "stabby", - "uninit", - "unwind_safe", - "with_builtin_macros", -] - -[[package]] -name = "safer_ffi-proc_macros" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f25be5ba5f319542edb31925517e0380245ae37df50a9752cdbc05ef948156" -dependencies = [ - "macro_rules_attribute", - "prettyplease", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "same-file" version = "1.0.6" @@ -8919,12 +8749,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - [[package]] name = "sharded-slab" version = "0.1.7" @@ -9325,40 +9149,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "stabby" -version = "36.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311d6bcf0070c462ff626122ec2246f42bd2acd44b28908eedbfd07d500c7d99" -dependencies = [ - "rustversion", - "stabby-abi", -] - -[[package]] -name = "stabby-abi" -version = "36.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6daae1a0707399f56d27fce7f212e50e31d215112a447e1bbcd837ae1bf5f49" -dependencies = [ - "rustversion", - "sha2-const-stable", - "stabby-macros", -] - -[[package]] -name = "stabby-macros" -version = "36.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cf89a0cc9131279235baf8599b0e073fbcb096419204de0cc5d1a48ae73f74" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "rand", - "syn 1.0.109", -] - [[package]] name = "stable-pattern" version = "0.1.0" @@ -10677,15 +10467,6 @@ dependencies = [ "weedle2", ] -[[package]] -name = "uninit" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e130f2ed46ca5d8ec13c7ff95836827f92f5f5f37fd2b2bf16f33c408d98bb6" -dependencies = [ - "extension-traits", -] - [[package]] name = "universal-hash" version = "0.5.1" @@ -10708,12 +10489,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "unwind_safe" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0976c77def3f1f75c4ef892a292c31c0bbe9e3d0702c63044d7c76db298171a3" - [[package]] name = "url" version = "2.5.2" @@ -11441,26 +11216,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "with_builtin_macros" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a59d55032495429b87f9d69954c6c8602e4d3f3e0a747a12dea6b0b23de685da" -dependencies = [ - "with_builtin_macros-proc_macros", -] - -[[package]] -name = "with_builtin_macros-proc_macros" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bd7679c15e22924f53aee34d4e448c45b674feb6129689af88593e129f8f42" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index d833eb8fe3..52ef268311 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,7 +107,6 @@ members = [ "sdk/ffi/cpp", "sdk/ffi/go", "sdk/ffi/shared", - "sdk/lib/socks5-listener", "sdk/rust/nym-sdk", "service-providers/authenticator", "service-providers/common", @@ -417,10 +416,6 @@ web-sys = "0.3.72" [profile.dev.package.sqlx-macros] opt-level = 3 -[profile.release.package.nym-socks5-listener] -strip = true -codegen-units = 1 - [profile.release.package.nym-client-wasm] # lto = true opt-level = 'z' diff --git a/sdk/lib/socks5-listener/Cargo.toml b/sdk/lib/socks5-listener/Cargo.toml deleted file mode 100644 index ac8c4d3e81..0000000000 --- a/sdk/lib/socks5-listener/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "nym-socks5-listener" -version = "0.1.0" -edition = "2021" -license.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "generate-headers" -required-features = ["headers"] - -[lib] -crate-type = ["cdylib", "staticlib", "rlib"] - -[dependencies] -anyhow = { workspace = true } -futures = { workspace = true } -lazy_static = { workspace = true } -nym-bin-common = { path = "../../../common/bin-common"} -nym-client-core = { path = "../../../common/client-core", default-features = false } -nym-config-common = { path = "../../../common/config", package = "nym-config" } -nym-credential-storage = { path = "../../../common/credential-storage" } -nym-crypto = { path = "../../../common/crypto" } -nym-socks5-client-core = { path = "../../../common/socks5-client-core", default-features = false } -serde = { workspace = true } -tokio = { workspace = true, features = ["sync", "time"] } -log = { workspace = true } -rand = { workspace = true } - -safer-ffi = { workspace = true } - -[target.'cfg(target_os="android")'.dependencies] -jni = { version = "0.21", default-features = false } -android_logger = "0.14.1" - - -[features] -headers = ["safer-ffi/headers"] diff --git a/sdk/lib/socks5-listener/Makefile b/sdk/lib/socks5-listener/Makefile deleted file mode 100644 index 85edf5b352..0000000000 --- a/sdk/lib/socks5-listener/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -UNAME_S := $(shell uname -s) - -# Default arch -ANDROID_TOOLCHAIN_ARCH=linux-x86_64 -ifeq ($(UNAME_S),Linux) - ANDROID_TOOLCHAIN_ARCH=linux-x86_64 -endif -ifeq ($(UNAME_S),Darwin) - ANDROID_TOOLCHAIN_ARCH=darwin-x86_64 -endif - -ANDROID_TOOLCHAIN=$(NDK_HOME)/toolchains/llvm/prebuilt/$(ANDROID_TOOLCHAIN_ARCH) -ANDROID_API=33 -ANDROID_TARGET_CC=$(ANDROID_TOOLCHAIN)/bin/x86_64-linux-android$(ANDROID_API)-clang -ANDROID_TARGET_AR=$(ANDROID_TOOLCHAIN)/bin/llvm-ar -ANDROID_TARGET_RANLIB=$(ANDROID_TOOLCHAIN)/bin/llvm-ranlib -ANDROID_CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$(ANDROID_TOOLCHAIN)/bin/x86_64-linux-android$(ANDROID_API)-clang - -# Common environment -ANDROID_ENV = \ - TARGET_CC=$(ANDROID_TARGET_CC) \ - TARGET_AR=$(ANDROID_TARGET_AR) \ - TARGET_RANLIB=$(ANDROID_TARGET_RANLIB) \ - CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$(ANDROID_CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER) - -ANDROID_TARGET=x86_64-linux-android - -none: - @echo "No default target. Please specify a target." - -gen-headers: - cargo run --features headers --bin generate-headers - -#gen-header: -# cbindgen --lang c --crate socks5-c --output socks5_c.h - -android: - $(ANDROID_ENV) cargo build --lib --target $(ANDROID_TARGET) - -android-release: - $(ANDROID_ENV) cargo build --lib --target $(ANDROID_TARGET) --release - -ios: - cargo lipo - -ios-release: - cargo lipo --release diff --git a/sdk/lib/socks5-listener/build-android-darwin.sh b/sdk/lib/socks5-listener/build-android-darwin.sh deleted file mode 100755 index 73a152076f..0000000000 --- a/sdk/lib/socks5-listener/build-android-darwin.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -export API=33 -export TOOLCHAIN="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64" -export TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android$API-clang" -export TARGET_AR="$TOOLCHAIN/bin/llvm-ar" -export TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" -export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/x86_64-linux-android$API-clang" - -cargo build --lib --target x86_64-linux-android --release diff --git a/sdk/lib/socks5-listener/build-android.sh b/sdk/lib/socks5-listener/build-android.sh deleted file mode 100755 index 8f199d347a..0000000000 --- a/sdk/lib/socks5-listener/build-android.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash -# -# Usage -# -# build-android.sh [ARCH ...] -# -# This script builds the lib for android and moves the shared -# objects (*.so) into the right app's directories -# -# ARCH: -# - aarch64 (arm 64) -# - x86_64 (classic PC 64) -# - i686 (x86) -# - armv7 -# -# ⚠ to build for release set the env var `RELEASE=true` - -set -E -set -o pipefail -trap 'catch $? ${FUNCNAME[0]:-main} $LINENO' ERR - -# ANSI style codes -RED="\e[38;5;1m" # red -GRN="\e[38;5;2m" # green -YLW="\e[38;5;3m" # yellow -BLD="\e[1m" # bold -RS="\e[0m" # style reset -# bold variants -B_RED="$BLD$RED" -B_GRN="$BLD$GRN" -B_YLW="$BLD$YLW" - -catch() { - echo -e " $B_RED✗$RS unexpected error, $BLD$2$RS [$BLD$1$RS] L#$BLD$3$RS" - exit 1 -} - -export API=33 -export TOOLCHAIN="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64" -export TARGET_AR="$TOOLCHAIN/bin/llvm-ar" -export TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" -export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/x86_64-linux-android$API-clang" -export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android$API-clang" - -# arch mapping between Rust targets (keys) and Android ABIs (values) -# https://developer.android.com/ndk/guides/abis.html -declare -A arch_map=([x86_64]="x86_64" [aarch64]="arm64-v8a" [armv7]="armeabi-v7a" [i686]="x86") - -output_dir=../../../target -jni_dir=../../../nym-connect/native/android/app/src/main/jniLibs -lib=libnym_socks5_listener.so - -build () { - abi="${arch_map[$1]}" - echo -e " $B_YLW⚡$RS building for arch $BLD$1$RS" - export TARGET_CC="$TOOLCHAIN/bin/$1-linux-android$API-clang" - if [ -a "$jni_dir/$abi/$lib" ]; then - # remove any previously built library - rm "$jni_dir/$abi/$lib" - fi - if [ "$RELEASE" = true ]; then - cargo build --lib --target "$1-linux-android" --release - mv "$output_dir/$1-linux-android/release/$lib" "$jni_dir/$abi/" - else - cargo build --lib --target "$1-linux-android" - mv "$output_dir/$1-linux-android/debug/$lib" "$jni_dir/$abi/" - fi - echo -e " $B_GRN✓$RS lib built successfully for $BLD$1$RS, moved under app's dir$BLD jniLibs/$abi/$RS" -} - -for arch in "$@"; do - if [ "${arch_map[$arch]}" ]; then - build "$arch" - else - echo -e " $B_RED✗$RS unknown arch $BLD$arch$RS" - exit 1 - fi -done diff --git a/sdk/lib/socks5-listener/socks5_c.h b/sdk/lib/socks5-listener/socks5_c.h deleted file mode 100644 index e5a570cba4..0000000000 --- a/sdk/lib/socks5-listener/socks5_c.h +++ /dev/null @@ -1,108 +0,0 @@ -/*! \file */ -/******************************************* - * * - * File auto-generated by `::safer_ffi`. * - * * - * Do not manually edit this file. * - * * - *******************************************/ - -#ifndef __RUST_NYM_SOCKS5_LISTENER__ -#define __RUST_NYM_SOCKS5_LISTENER__ -#ifdef __cplusplus -extern "C" { -#endif - - -#include -#include - -/** */ -/** \remark Has the same ABI as `uint8_t` **/ -#ifdef DOXYGEN -typedef -#endif -enum ClientState { - /** */ - CLIENT_STATE_UNINITIALISED, - /** */ - CLIENT_STATE_CONNECTED, - /** */ - CLIENT_STATE_DISCONNECTED, -} -#ifndef DOXYGEN -; typedef uint8_t -#endif -ClientState_t; - -/** \brief - * `&'lt mut (dyn 'lt + Send + FnMut(A1) -> Ret)` - */ -typedef struct RefDynFnMut1_void_char_ptr { - /** */ - void * env_ptr; - - /** */ - void (*call)(void *, char *); -} RefDynFnMut1_void_char_ptr_t; - -/** \brief - * `&'lt mut (dyn 'lt + Send + FnMut() -> Ret)` - */ -typedef struct RefDynFnMut0_void { - /** */ - void * env_ptr; - - /** */ - void (*call)(void *); -} RefDynFnMut0_void_t; - -/** */ -void -blocking_run_client ( - char const * storage_directory, - char const * service_provider, - RefDynFnMut1_void_char_ptr_t on_start_callback, - RefDynFnMut0_void_t on_shutdown_callback); - -/** */ -char * -existing_service_provider ( - char const * storage_directory); - -/** */ -ClientState_t -get_client_state (void); - -/** */ -void -initialise_logger (void); - -/** */ -void -reset_client_data ( - char const * root_directory); - -/** */ -void -rust_free_string ( - char * string); - -/** */ -void -start_client ( - char const * storage_directory, - char const * service_provider, - RefDynFnMut1_void_char_ptr_t on_start_callback, - RefDynFnMut0_void_t on_shutdown_callback); - -/** */ -void -stop_client (void); - - -#ifdef __cplusplus -} /* extern \"C\" */ -#endif - -#endif /* __RUST_NYM_SOCKS5_LISTENER__ */ diff --git a/sdk/lib/socks5-listener/src/android.rs b/sdk/lib/socks5-listener/src/android.rs deleted file mode 100644 index b8c6032aef..0000000000 --- a/sdk/lib/socks5-listener/src/android.rs +++ /dev/null @@ -1,97 +0,0 @@ -use crate::ClientState; -use ::safer_ffi::prelude::*; -use jni::{ - objects::{JClass, JObject, JString}, - sys::jint, - JNIEnv, -}; -use std::sync::{Arc, Mutex}; - -fn init_jni_logger() { - use android_logger::{Config, FilterBuilder}; - use log::LevelFilter; - - android_logger::init_once( - Config::default() - .with_max_level(LevelFilter::Trace) - .with_tag("libnyms5") - .with_filter( - FilterBuilder::new() - .parse("debug,tungstenite=warn,mio=warn,tokio_tungstenite=warn") - .build(), - ), - ); - log::debug!("Logger initialized"); -} - -/// Blocking call that starts the socks5 listener -#[no_mangle] -pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_startClient( - mut env: JNIEnv, - _class: JClass, - service_provider: JString, - start_cb: JObject, - stop_cb: JObject, -) { - init_jni_logger(); - - let sp_input: String = env - .get_string(&service_provider) - .expect("Couldn't get java string!") - .into(); - - log::debug!("using sp {}", sp_input); - - let service_provider = char_p::new(sp_input.as_str()); - - let arced = Arc::new(Mutex::new(env)); - let env_start = arced.clone(); - let env_stop = arced.clone(); - - crate::blocking_run_client( - None, - Some(service_provider.as_ref()), - move |_| { - log::debug!("client connected"); - env_start - .lock() - .unwrap() - .call_method(&start_cb, "onStart", "()V", &[]) - .expect("failed to call Java callbacks"); - }, - move || { - log::debug!("client disconnected"); - env_stop - .lock() - .unwrap() - .call_method(&stop_cb, "onStop", "()V", &[]) - .expect("failed to call Java callbacks"); - }, - ); -} - -#[no_mangle] -pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_stopClient(_env: JNIEnv, _class: JClass) { - crate::stop_client(); -} - -#[no_mangle] -pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_getClientState( - _env: JNIEnv, - _class: JClass, -) -> jint { - let state = crate::get_client_state(); - log::debug!("client state {:?}", state); - - match state { - ClientState::Uninitialised => 0, - ClientState::Connected => 1, - ClientState::Disconnected => 2, - } -} - -#[no_mangle] -pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_pingClient(_env: JNIEnv, _class: JClass) { - log::debug!("pong"); - crate::ping_client(); -} diff --git a/sdk/lib/socks5-listener/src/bin/generate-headers.rs b/sdk/lib/socks5-listener/src/bin/generate-headers.rs deleted file mode 100644 index 70a7527b01..0000000000 --- a/sdk/lib/socks5-listener/src/bin/generate-headers.rs +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -fn main() -> ::std::io::Result<()> { - ::nym_socks5_listener::generate_headers() -} diff --git a/sdk/lib/socks5-listener/src/config/mod.rs b/sdk/lib/socks5-listener/src/config/mod.rs deleted file mode 100644 index 5ace48c88f..0000000000 --- a/sdk/lib/socks5-listener/src/config/mod.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::config::persistence::MobileSocksClientPaths; -use crate::config::template::CONFIG_TEMPLATE; -use nym_bin_common::logging::LoggingSettings; -use nym_config_common::{ - read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate, - DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR, -}; -use nym_socks5_client_core::config::Config as CoreConfig; -use serde::{Deserialize, Serialize}; -use std::io; -use std::path::{Path, PathBuf}; - -mod persistence; -mod template; - -const DEFAULT_SOCKS5_CLIENTS_DIR: &str = "socks5-clients"; - -/// Derive default path to clients's config directory. -/// It should get resolved to `$HOME/.nym/socks5-clients//config` -pub fn config_directory_from_root, R: AsRef>(root: P, id: R) -> PathBuf { - root.as_ref() - .join(NYM_DIR) - .join(DEFAULT_SOCKS5_CLIENTS_DIR) - .join(id) - .join(DEFAULT_CONFIG_DIR) -} - -/// Derive default path to client's config file. -/// It should get resolved to `$HOME/.nym/socks5-clients//config/config.toml` -pub fn config_filepath_from_root, R: AsRef>(root: P, id: R) -> PathBuf { - config_directory_from_root(root, id).join(DEFAULT_CONFIG_FILENAME) -} - -/// Derive default path to client's data directory where files, such as keys, are stored. -/// It should get resolved to `$HOME/.nym/socks5-clients//data` -pub fn data_directory_from_root, R: AsRef>(root: P, id: R) -> PathBuf { - root.as_ref() - .join(NYM_DIR) - .join(DEFAULT_SOCKS5_CLIENTS_DIR) - .join(id) - .join(DEFAULT_DATA_DIR) -} - -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Config { - pub core: CoreConfig, - - pub storage_paths: Option, - - pub logging: LoggingSettings, -} - -impl NymConfigTemplate for Config { - fn template(&self) -> &'static str { - CONFIG_TEMPLATE - } -} - -impl Config { - pub fn new(storage_root: Option

, id: S, provider_mix_address: S) -> Self - where - P: AsRef, - S: AsRef, - { - Config { - core: CoreConfig::new( - id.as_ref(), - env!("CARGO_PKG_VERSION"), - provider_mix_address.as_ref(), - ), - storage_paths: storage_root.map(|storage_root| { - MobileSocksClientPaths::new_default(data_directory_from_root( - storage_root, - id.as_ref(), - )) - }), - logging: Default::default(), - } - } - - pub fn read_from_toml_file>(path: P) -> io::Result { - read_config_from_toml_file(path) - } - - pub fn read_from_default_path, R: AsRef>( - storage_root: P, - id: R, - ) -> io::Result { - Self::read_from_toml_file(config_filepath_from_root(storage_root, id)) - } - - pub fn save_to_default_location>(&self, storage_root: P) -> io::Result<()> { - let config_save_location: PathBuf = - config_filepath_from_root(storage_root, &self.core.base.client.id); - save_formatted_config_to_file(self, config_save_location) - } -} diff --git a/sdk/lib/socks5-listener/src/config/persistence.rs b/sdk/lib/socks5-listener/src/config/persistence.rs deleted file mode 100644 index 525ea7066f..0000000000 --- a/sdk/lib/socks5-listener/src/config/persistence.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::config::data_directory_from_root; -use nym_client_core::config::disk_persistence::CommonClientPaths; -use serde::{Deserialize, Serialize}; -use std::path::Path; - -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)] -pub struct MobileSocksClientPaths { - #[serde(flatten)] - pub common_paths: CommonClientPaths, -} - -impl MobileSocksClientPaths { - pub fn new_default>(base_data_directory: P) -> Self { - MobileSocksClientPaths { - common_paths: CommonClientPaths::new_base(base_data_directory), - } - } - - pub fn change_root, R: AsRef>(&mut self, new_root: P, id: R) { - let new_data_dir = data_directory_from_root(new_root, id); - self.common_paths = CommonClientPaths::new_base(new_data_dir) - } -} diff --git a/sdk/lib/socks5-listener/src/config/template.rs b/sdk/lib/socks5-listener/src/config/template.rs deleted file mode 100644 index e2ad4c414d..0000000000 --- a/sdk/lib/socks5-listener/src/config/template.rs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -// While using normal toml marshalling would have been way simpler with less overhead, -// I think it's useful to have comments attached to the saved config file to explain behaviour of -// particular fields. -// Note: any changes to the template must be reflected in the appropriate structs. -pub(crate) const CONFIG_TEMPLATE: &str = r#" -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -##### main base client config options ##### - -[core.client] -# Version of the client for which this configuration was created. -version = '{{ core.client.version }}' - -# Human readable ID of this particular client. -id = '{{ core.client.id }}' - -# Indicates whether this client is running in a disabled credentials mode, thus attempting -# to claim bandwidth without presenting bandwidth credentials. -disabled_credentials_mode = {{ core.client.disabled_credentials_mode }} - -# Addresses to nyxd validators via which the client can communicate with the chain. -nyxd_urls = [ - {{#each core.client.nyxd_urls }} - '{{this}}', - {{/each}} -] - -# Addresses to APIs running on validator from which the client gets the view of the network. -nym_api_urls = [ - {{#each core.client.nym_api_urls }} - '{{this}}', - {{/each}} -] - -[storage_paths] - -# Path to file containing private identity key. -keys.private_identity_key_file = '{{ storage_paths.keys.private_identity_key_file }}' - -# Path to file containing public identity key. -keys.public_identity_key_file = '{{ storage_paths.keys.public_identity_key_file }}' - -# Path to file containing private encryption key. -keys.private_encryption_key_file = '{{ storage_paths.keys.private_encryption_key_file }}' - -# Path to file containing public encryption key. -keys.public_encryption_key_file = '{{ storage_paths.keys.public_encryption_key_file }}' - -# Path to file containing key used for encrypting and decrypting the content of an -# acknowledgement so that nobody besides the client knows which packet it refers to. -keys.ack_key_file = '{{ storage_paths.keys.ack_key_file }}' - -# Path to the database containing bandwidth credentials -credentials_database = '{{ storage_paths.credentials_database }}' - -# Path to the persistent store for received reply surbs, unused encryption keys and used sender tags. -reply_surb_database = '{{ storage_paths.reply_surb_database }}' - -# Path to the file containing information about gateways used by this client, -# i.e. details such as their public keys, owner addresses or the network information. -gateway_registrations = '{{ storage_paths.gateway_registrations }}' - -##### socket config options ##### - -[core.socks5] - -# The mix address of the provider to which all requests are going to be sent. -provider_mix_address = '{{ core.socks5.provider_mix_address }}' - -# The address on which the client will be listening for incoming requests -# (default: 127.0.0.1:1080) -bind_address = '{{ core.socks5.bind_address }}' - -# Specifies whether this client is going to use an anonymous sender tag for communication with the service provider. -# While this is going to hide its actual address information, it will make the actual communication -# slower and consume nearly double the bandwidth as it will require sending reply SURBs. -# -# Note that some service providers might not support this. -send_anonymously = {{ core.socks5.send_anonymously }} - -##### logging configuration options ##### - -[logging] - -# TODO - - -##### debug configuration options ##### -# The following options should not be modified unless you know EXACTLY what you are doing -# as if set incorrectly, they may impact your anonymity. - -# [core.socks5.socks5_debug] - - -[core.debug] - -[core.debug.traffic] -average_packet_delay = '{{ core.debug.traffic.average_packet_delay }}' -message_sending_average_delay = '{{ core.debug.traffic.message_sending_average_delay }}' - -[core.debug.acknowledgements] -average_ack_delay = '{{ core.debug.acknowledgements.average_ack_delay }}' - -[core.debug.cover_traffic] -loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}' - -"#; diff --git a/sdk/lib/socks5-listener/src/lib.rs b/sdk/lib/socks5-listener/src/lib.rs deleted file mode 100644 index 3019402182..0000000000 --- a/sdk/lib/socks5-listener/src/lib.rs +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::config::{config_filepath_from_root, Config}; -use crate::persistence::MobileClientStorage; -use ::safer_ffi::prelude::*; -use anyhow::{anyhow, Result}; -use lazy_static::lazy_static; -use log::{debug, info, warn}; -use nym_bin_common::logging::setup_logging; -use nym_client_core::init::helpers::current_gateways; -use nym_client_core::init::types::{GatewaySelectionSpecification, GatewaySetup}; -use nym_config_common::defaults::setup_env; -use nym_socks5_client_core::NymClient as Socks5NymClient; -use rand::rngs::OsRng; -use safer_ffi::char_p::char_p_boxed; -use std::path::PathBuf; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use std::time::Duration; -use tokio::runtime::Runtime; -use tokio::sync::{Mutex, Notify}; -use tokio::time::{sleep, Instant}; - -#[cfg(target_os = "android")] -pub mod android; -mod config; -mod persistence; - -static SOCKS5_CONFIG_ID: &str = "mobile-socks5-test"; -const ANDROID_HEALTHCHECK_INTERVAL: Duration = Duration::from_secs(5); -const HEALTHCHECK_TIMEOUT: Duration = Duration::from_secs(10); - -// hehe, this is so disgusting : ) -lazy_static! { - static ref CLIENT_SHUTDOWN_HANDLE: Mutex>> = Mutex::new(None); - static ref RUNTIME: Runtime = Runtime::new().unwrap(); - static ref LAST_HEALTHCHECK_PING: Mutex> = Mutex::new(None); -} -static ENV_SET: AtomicBool = AtomicBool::new(false); - -async fn set_shutdown_handle(handle: Arc) { - let mut guard = CLIENT_SHUTDOWN_HANDLE.lock().await; - if guard.is_some() { - panic!("client wasn't properly stopped") - } - *guard = Some(handle) -} - -async fn stop_and_reset_shutdown_handle() { - let mut guard = CLIENT_SHUTDOWN_HANDLE.lock().await; - if let Some(sh) = &*guard { - sh.notify_waiters() - } else { - panic!("client wasn't properly started") - } - - *guard = None -} - -async fn is_shutdown_handle_set() -> bool { - CLIENT_SHUTDOWN_HANDLE.lock().await.is_some() -} - -fn set_default_env() { - if !ENV_SET.swap(true, Ordering::SeqCst) { - setup_env::<&str>(None); - } -} - -// to be used with the on startup callback which returns the address -#[ffi_export] -pub fn rust_free_string(string: char_p::Box) { - drop(string) -} - -#[ffi_export] -pub fn initialise_logger() { - setup_logging(); - info!("logger initialised"); -} - -#[derive_ReprC] -#[ffi_export] -#[repr(u8)] -#[derive(Eq, PartialEq, Debug)] -pub enum ClientState { - Uninitialised, - Connected, - Disconnected, -} - -#[ffi_export] -pub fn get_client_state() -> ClientState { - // if the environment is not set, we never called start before - // if the shutdown was never set, the client can't possibly be running - // and similarly if it's set, it's most likely running - if !ENV_SET.load(Ordering::Relaxed) { - ClientState::Uninitialised - } else if RUNTIME.block_on(is_shutdown_handle_set()) { - ClientState::Connected - } else { - ClientState::Disconnected - } -} - -pub fn start_client( - storage_directory: Option>, - service_provider: Option>, - on_start_callback: F, - on_shutdown_callback: S, -) where - F: FnMut(String) + Send + 'static, - S: FnMut() + Send + 'static, -{ - if get_client_state() == ClientState::Connected { - warn!("could not start the client as it's already running"); - return; - } - - let storage_dir = storage_directory.map(|s| s.to_string()); - let service_provider = service_provider.map(|s| s.to_string()); - RUNTIME.spawn(async move { - _async_run_client( - storage_dir, - SOCKS5_CONFIG_ID.to_string(), - service_provider, - on_start_callback, - on_shutdown_callback, - ) - .await - }); -} - -#[ffi_export] -pub fn stop_client() { - if get_client_state() == ClientState::Disconnected { - warn!("could not stop the client as it's not running "); - return; - } - - RUNTIME.block_on(async move { stop_and_reset_shutdown_handle().await }); -} - -#[ffi_export] -pub fn ping_client() { - RUNTIME.spawn(async { - let mut guard = LAST_HEALTHCHECK_PING.lock().await; - *guard = Some(Instant::now()); - }); -} - -// Continusouly poll that we are being pinged from the outside. If the pings stop that means -// that the higher layer somehow terminated without telling us. -pub async fn health_check() { - // init the ping to now - let mut guard = LAST_HEALTHCHECK_PING.lock().await; - *guard = Some(Instant::now()); - // release the mutex - drop(guard); - - loop { - sleep(ANDROID_HEALTHCHECK_INTERVAL).await; - - if !is_shutdown_handle_set().await { - debug!("client has been shutdown, cancelling healthcheck"); - break; - } - let mut guard = LAST_HEALTHCHECK_PING.lock().await; - let Some(last_ping) = *guard else { - warn!("client has not been pinged yet - shutting down"); - *guard = None; - stop_and_reset_shutdown_handle().await; - break; - }; - if last_ping.elapsed() > HEALTHCHECK_TIMEOUT { - warn!( - "client has not been pinged for more than {} seconds - shutting down", - HEALTHCHECK_TIMEOUT.as_secs() - ); - *guard = None; - stop_and_reset_shutdown_handle().await; - break; - } - debug!("✓ android app healthy"); - } -} - -pub fn blocking_run_client<'cb, F, S>( - storage_directory: Option>, - service_provider: Option>, - on_start_callback: F, - on_shutdown_callback: S, -) where - F: FnMut(String) + 'cb, - S: FnMut() + 'cb, -{ - if get_client_state() == ClientState::Connected { - warn!("could not start the client as it's already running"); - return; - } - - // Spawn a task that monitors that we are continuously receiving pings from the outside, - // to make sure we don't end up with a runaway process - RUNTIME.spawn(async { health_check().await }); - - let storage_dir = storage_directory.map(|s| s.to_string()); - let service_provider = service_provider.map(|s| s.to_string()); - RUNTIME - .block_on(async move { - _async_run_client( - storage_dir, - SOCKS5_CONFIG_ID.to_string(), - service_provider, - on_start_callback, - on_shutdown_callback, - ) - .await - }) - .map_err(|err| { - warn!("failed to run client: {}", err); - }) - .ok(); -} - -#[ffi_export] -pub fn reset_client_data(root_directory: char_p::Ref<'_>) { - if get_client_state() == ClientState::Connected { - return; - } - - let root_dir = root_directory.to_string(); - _reset_client_data(root_dir) -} - -#[ffi_export] -pub fn existing_service_provider(storage_directory: char_p::Ref<'_>) -> Option { - if let Ok(config) = Config::read_from_default_path(storage_directory.to_str(), SOCKS5_CONFIG_ID) - { - Some(config.core.socks5.provider_mix_address.try_into().unwrap()) - } else { - None - } -} - -fn _reset_client_data(root_directory: String) { - let client_storage_dir = PathBuf::new().join(root_directory).join(SOCKS5_CONFIG_ID); - std::fs::remove_dir_all(client_storage_dir).expect("failed to clear client data") -} - -async fn _async_run_client( - storage_dir: Option, - client_id: String, - service_provider: Option, - mut on_start_callback: F, - mut on_shutdown_callback: S, -) -> anyhow::Result<()> -where - F: FnMut(String), - S: FnMut(), -{ - let mut rng = OsRng; - - set_default_env(); - let stop_handle = Arc::new(Notify::new()); - set_shutdown_handle(stop_handle.clone()).await; - - let config = load_or_generate_base_config(storage_dir, client_id, service_provider).await?; - let nym_apis = config.core.base.client.nym_api_urls.clone(); - - let storage = MobileClientStorage::new(&config); - let user_agent = nym_bin_common::bin_info!().into(); - let socks5_client = Socks5NymClient::new(config.core, storage, user_agent, None) - .with_gateway_setup(GatewaySetup::New { - specification: GatewaySelectionSpecification::UniformRemote { - must_use_tls: false, - }, - available_gateways: current_gateways(&mut rng, &nym_apis, None, 50).await?, - }); - - eprintln!("starting the socks5 client"); - let started_client = socks5_client.start().await?; - eprintln!("the client has started!"); - - // invoke the callback since we've started! - on_start_callback(started_client.address.to_string()); - - // wait for notify to be set... - stop_handle.notified().await; - - // and then do graceful shutdown of all tasks - let mut task_manager = started_client - .shutdown_handle - .try_into_task_manager() - .unwrap(); - task_manager.signal_shutdown().ok(); - task_manager.wait_for_shutdown().await; - - // and the corresponding one for shutdown! - on_shutdown_callback(); - - Ok(()) -} - -// note: it does might not contain any gateway configuration and should not be persisted in that state! -async fn load_or_generate_base_config( - storage_dir: Option, - client_id: String, - service_provider: Option, -) -> Result { - let Some(storage_dir) = storage_dir else { - eprintln!("no storage path specified"); - return setup_new_client_config(None, client_id, service_provider).await; - }; - - let expected_store_path = config_filepath_from_root(&storage_dir, &client_id); - eprintln!( - "attempting to load socks5 config from {}", - expected_store_path.display() - ); - - // simulator workaround - if let Ok(mut config) = Config::read_from_toml_file(expected_store_path) { - eprintln!("loaded config"); - if let Some(storage_paths) = &mut config.storage_paths { - if !storage_paths - .common_paths - .keys - .public_identity_key_file - .starts_with(&storage_dir) - { - eprintln!("... but it seems to have been made for different container - fixing it up... (ASSUMING DEFAULT PATHS)"); - storage_paths.change_root(storage_dir, &config.core.base.client.id); - } - } - - return Ok(config); - }; - - eprintln!("creating new config"); - setup_new_client_config(Some(storage_dir), client_id, service_provider).await -} - -async fn setup_new_client_config( - storage_dir: Option, - client_id: String, - service_provider: Option, -) -> Result { - let service_provider = service_provider.ok_or(anyhow!( - "service provider was not specified for fresh config" - ))?; - - let mut new_config = Config::new(storage_dir.as_ref(), client_id, service_provider); - - if let Ok(raw_validators) = std::env::var(nym_config_common::defaults::var_names::NYM_API) { - new_config - .core - .base - .set_custom_nym_apis(nym_config_common::parse_urls(&raw_validators)); - } - - if let Some(_storage_paths) = &new_config.storage_paths { - println!("persistent storage is not implemented"); - }; - - if let Some(storage_dir) = storage_dir { - new_config.save_to_default_location(storage_dir)?; - } - - Ok(new_config) -} - -#[cfg(feature = "headers")] // c.f. the `Cargo.toml` section -pub fn generate_headers() -> ::std::io::Result<()> { - ::safer_ffi::headers::builder() - .to_file("socks5_c.h")? - .generate() -} diff --git a/sdk/lib/socks5-listener/src/persistence.rs b/sdk/lib/socks5-listener/src/persistence.rs deleted file mode 100644 index 77a903144a..0000000000 --- a/sdk/lib/socks5-listener/src/persistence.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2023 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::config::Config; -use nym_client_core::client::base_client::storage::{InMemGatewaysDetails, MixnetClientStorage}; -use nym_client_core::client::key_manager::persistence::InMemEphemeralKeys; -use nym_client_core::client::replies::reply_storage; -use nym_credential_storage::ephemeral_storage::EphemeralStorage as EphemeralCredentialStorage; - -pub struct MobileClientStorage { - // the key storage is now useless without gateway details store. so use ephemeral for everything. - key_store: InMemEphemeralKeys, - gateway_details_store: InMemGatewaysDetails, - - reply_store: reply_storage::Empty, - credential_store: EphemeralCredentialStorage, -} - -impl MixnetClientStorage for MobileClientStorage { - type KeyStore = InMemEphemeralKeys; - type ReplyStore = reply_storage::Empty; - type CredentialStore = EphemeralCredentialStorage; - type GatewaysDetailsStore = InMemGatewaysDetails; - - fn into_runtime_stores( - self, - ) -> ( - Self::ReplyStore, - Self::CredentialStore, - Self::GatewaysDetailsStore, - ) { - ( - self.reply_store, - self.credential_store, - self.gateway_details_store, - ) - } - - fn key_store(&self) -> &Self::KeyStore { - &self.key_store - } - - fn reply_store(&self) -> &Self::ReplyStore { - &self.reply_store - } - - fn credential_store(&self) -> &Self::CredentialStore { - &self.credential_store - } - - fn gateway_details_store(&self) -> &Self::GatewaysDetailsStore { - &self.gateway_details_store - } -} - -impl MobileClientStorage { - pub fn new(_config: &Config) -> Self { - MobileClientStorage { - key_store: Default::default(), - gateway_details_store: Default::default(), - reply_store: Default::default(), - credential_store: Default::default(), - } - } -}