Skip to content

Commit

Permalink
add ipset session
Browse files Browse the repository at this point in the history
  • Loading branch information
lazytiger committed Dec 27, 2023
1 parent 9a0a7cc commit 01ac3f4
Show file tree
Hide file tree
Showing 22 changed files with 438 additions and 139 deletions.
15 changes: 14 additions & 1 deletion mobile2/backend/gen/android/.idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions mobile2/backend/gen/android/.idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion mobile2/backend/gen/android/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 32 additions & 1 deletion mobile2/backend/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::sync::RwLock;
use std::sync::{atomic::AtomicBool, Arc, RwLock};

use anyhow::Result;
use lazy_static::lazy_static;
Expand Down Expand Up @@ -101,3 +101,34 @@ pub fn set_config(data: String) -> Result<(), Error> {
pub fn set_app_list(data: String) -> Result<(), Error> {
call_js(format!("window.setAppList('{}');", data))
}

pub fn set_error(message: String) -> Result<(), Error> {
call_js(format!("window.setError('{}');", message))
}

pub fn on_start(fd: i32) {
let mut looper = LOOPER.write().unwrap();
looper.running = Arc::new(AtomicBool::new(true));
let running = looper.running.clone();
std::thread::spawn(move || {
if let Err(err) = std::panic::catch_unwind(|| {
if let Err(err) = crate::tun::start_vpn(fd, running) {
log::error!("vpn service exit with:{:?}", err);
}
}) {
log::error!("vpn service exit with:{:?}", err);
}
if let Err(err) = stop_vpn() {
log::error!("stop vpn failed:{:?}", err);
}
});
}

pub fn on_stop() {
let looper = LOOPER.read().unwrap();
looper.running.store(false, Ordering::Relaxed);
}

pub fn on_network_changed(enable: bool) {
log::info!("network status changed:{}", enable);
}
114 changes: 114 additions & 0 deletions mobile2/backend/src/platform/android.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,117 @@ pub fn init_builder(builder: WebViewBuilder) -> WebViewBuilder {
.with_asset_loader("wry".into())
.with_https_scheme(true)
}

unsafe fn call_jni<T, R>(callback: T) -> Result<R, Error>
where
T: FnOnce(JObject<'_>, AttachGuard<'_>) -> Result<R, Error>,
{
let ctx = ndk_context::android_context();
let vm = jni::JavaVM::from_raw(ctx.vm().cast())?;
let env = vm.attach_current_thread()?;
let ctx = JObject::from_raw(ctx.context() as jobject);
callback(ctx, env)
}

pub fn get_init_data() -> Result<String, crate::types::Error> {
unsafe {
call_jni(|ctx, mut env| {
let value = env
.call_method(ctx, "getInitData", "()Ljava/lang/String;", &[])?
.l()?;
let value: jni::objects::JString = value.into();
let value = env.get_string(&value)?.to_string_lossy().to_string();
log::info!("init data:{}", value);
Ok(value)
})
}
}

pub fn start_vpn(app: String, dns: String, gateway: String) -> Result<(), crate::types::Error> {
unsafe {
call_jni(|ctx, mut env| {
let app = env.new_string(app)?;
let dns = env.new_string(dns)?;
let gateway = env.new_string(gateway)?;
env.call_method(
ctx,
"startVpn",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
&[(&app).into(), (&dns).into(), (&gateway).into()],
)?;
Ok(())
})
}
}

pub fn stop_vpn() -> Result<(), crate::types::Error> {
unsafe {
call_jni(|ctx, mut env| {
env.call_method(ctx, "stopVpn", "()V", &[])?;
Ok(())
})
}
}

pub fn update_notification(message: String) -> Result<(), crate::types::Error> {
unsafe {
call_jni(|ctx, mut env| {
let message = env.new_string(message)?;
env.call_method(
ctx,
"updateNotification",
"(Ljava/lang/String;)V",
&[(&message).into()],
)?;
Ok(())
})
}
}

#[no_mangle]
pub extern "system" fn Java_com_bmshi_mobiletrojan_TrojanService_onStart<'local>(
_: JNIEnv<'local>,
_: JObject<'local>,
fd: jint,
) {
log::info!("service start with fd:{}", fd);
if let Err(err) = set_error("serviceStarted".to_string()) {
log::error!("call set_error failed:{:?}", err);
}
crate::on_start(fd);
}

#[no_mangle]
pub extern "system" fn Java_com_bmshi_mobiletrojan_TrojanService_onStop<'local>(
_: JNIEnv<'local>,
_: JObject<'local>,
) {
log::info!("service stopped");
if let Err(err) = set_error("serviceStopped".to_string()) {
log::error!("call set_error failed:{:?}", err);
}
crate::on_stop();
}

#[no_mangle]
pub extern "system" fn Java_com_bmshi_mobiletrojan_TrojanService_onNetworkChanged<'local>(
_: JNIEnv<'local>,
_: JObject<'local>,
available: jboolean,
) {
log::info!("network:{}", available);
crate::on_network_changed(available != 0)
}

#[no_mangle]
pub extern "system" fn Java_com_bmshi_mobiletrojan_MainActivity_onError<'local>(
mut env: JNIEnv<'local>,
_: JObject<'local>,
message: JObject<'local>,
) {
let message: JString<'local> = message.into();
let message = env.get_string(&message).unwrap();
if let Err(err) = set_error(message.to_string_lossy().to_string()) {
log::error!("call set_error failed:{:?}", err);
}
}
13 changes: 12 additions & 1 deletion mobile2/backend/src/types.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
use derive_more::From;
use serde::Deserialize;
use std::{env::JoinPathsError, sync::RwLock};
use std::{
env::JoinPathsError,
sync::{atomic::AtomicBool, Arc, RwLock},
};
use wry::application::event_loop::{EventLoop, EventLoopBuilder, EventLoopClosed, EventLoopProxy};

pub struct MobileTrojanLoop {
pub looper: Option<EventLoop<String>>,
pub proxy: EventLoopProxy<String>,
pub running: Arc<AtomicBool>,
}

unsafe impl Sync for MobileTrojanLoop {}
Expand All @@ -17,6 +21,7 @@ impl MobileTrojanLoop {
let proxy = looper.create_proxy();
RwLock::new(Self {
looper: Some(looper),
running: Arc::new(AtomicBool::new(false)),
proxy,
})
}
Expand All @@ -28,6 +33,12 @@ pub struct IPCRequest {
pub payload: String,
}

#[derive(Deserialize, Debug, Default)]
pub struct InitDataResponse {
pub path: String,
pub pnames: Vec<String>,
}

#[derive(From, Debug)]
pub enum Error {
#[cfg(target_os = "android")]
Expand Down
75 changes: 0 additions & 75 deletions mobile2/frontend/src/components/HelloWorld.vue

This file was deleted.

40 changes: 40 additions & 0 deletions mobile2/frontend/src/components/Ladder.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<script setup lang="ts">
import {useAppStore} from "@/store/app";
import {ref} from "vue";
let store = useAppStore();
let query = ref("")
let showResult = ref(true)
function doQuery() {
}
function handleDomain() {
}
</script>

<template>
<v-container class="mx-auto" style="max-width: 480px;">
<v-row>
<v-col>
<v-text-field v-model="query" label="域名关键字"
variant="outlined"></v-text-field>
</v-col>
<v-col cols="2">
<v-btn icon @click="doQuery">
<v-icon>mdi-tab-search</v-icon>
</v-btn>
</v-col>
</v-row>
<div v-if="showResult">
<v-list :items="store.domains" class="my-list" @click:select="handleDomain">
</v-list>
</div>
</v-container>
</template>

<style scoped>
</style>
Loading

0 comments on commit 01ac3f4

Please sign in to comment.