Browse Source
- Add `embed_session_info` boolean field to Args struct with CLI argument - Add `runWithSessionInfo` JNI method in android.rs accepting embed_session_info parameter - Pass embed_session_info flag through SocksProxyManager and SocksProxyImpl constructors - Modify SOCKS5 authentication to embed session info in username field when enabled - Format embedded username as "original_username|protocol|src_ip|src_port" - Enable per-app routing on Androidpull/245/head
4 changed files with 87 additions and 4 deletions
@ -58,6 +58,58 @@ pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_run( |
|||||
.resolve::<jni::errors::LogErrorAndDefault>() |
.resolve::<jni::errors::LogErrorAndDefault>() |
||||
} |
} |
||||
|
|
||||
|
/// # Safety
|
||||
|
///
|
||||
|
/// Running tun2proxy with some arguments including embed_session_info option
|
||||
|
/// Parameters:
|
||||
|
/// - proxy_url: the proxy url, e.g. "socks5://user:[email protected]:1080"
|
||||
|
/// - tun_fd: the tun file descriptor, it will be owned by tun2proxy
|
||||
|
/// - close_fd_on_drop: whether close the tun_fd on drop
|
||||
|
/// - tun_mtu: the tun mtu
|
||||
|
/// - dns_strategy: the dns strategy, see ArgDns enum
|
||||
|
/// - verbosity: the verbosity level, see ArgVerbosity enum
|
||||
|
/// - embed_session_info: if true, embeds session info in SOCKS5 username field
|
||||
|
/// Format: "original_username|protocol|src_ip|src_port"
|
||||
|
/// Use this with getConnectionOwnerUid() for per-app routing on Android 10+
|
||||
|
#[unsafe(no_mangle)] |
||||
|
pub unsafe extern "C" fn Java_com_github_shadowsocks_bg_Tun2proxy_runWithSessionInfo( |
||||
|
mut env: EnvUnowned<'_>, |
||||
|
_clazz: JClass<'_>, |
||||
|
proxy_url: JString<'_>, |
||||
|
tun_fd: jint, |
||||
|
close_fd_on_drop: jboolean, |
||||
|
tun_mtu: jchar, |
||||
|
verbosity: jint, |
||||
|
dns_strategy: jint, |
||||
|
embed_session_info: jboolean, |
||||
|
) -> jint { |
||||
|
let dns = dns_strategy.try_into().unwrap(); |
||||
|
let verbosity = verbosity.try_into().unwrap(); |
||||
|
let filter_str = &format!("off,tun2proxy={verbosity}"); |
||||
|
let filter = android_logger::FilterBuilder::new().parse(filter_str).build(); |
||||
|
android_logger::init_once( |
||||
|
android_logger::Config::default() |
||||
|
.with_tag("tun2proxy") |
||||
|
.with_max_level(log::LevelFilter::Trace) |
||||
|
.with_filter(filter), |
||||
|
); |
||||
|
env.with_env(|env: &mut Env| -> Result<jint> { |
||||
|
let proxy_url = get_java_string(env, &proxy_url).unwrap(); |
||||
|
let proxy = ArgProxy::try_from(proxy_url.as_str()).unwrap(); |
||||
|
|
||||
|
let mut args = Args::default(); |
||||
|
args.proxy(proxy) |
||||
|
.tun_fd(Some(tun_fd)) |
||||
|
.close_fd_on_drop(close_fd_on_drop) |
||||
|
.dns(dns) |
||||
|
.verbosity(verbosity) |
||||
|
.embed_session_info(embed_session_info != 0); |
||||
|
let v = crate::general_api::general_run_for_api(args, tun_mtu, false); |
||||
|
Ok::<jint, Error>(v) |
||||
|
}) |
||||
|
.resolve::<jni::errors::LogErrorAndDefault>() |
||||
|
} |
||||
|
|
||||
/// # Safety
|
/// # Safety
|
||||
///
|
///
|
||||
/// Shutdown tun2proxy
|
/// Shutdown tun2proxy
|
||||
|
|||||
Loading…
Reference in new issue