diff --git a/Cargo.lock b/Cargo.lock index 8e4d1bd..c16d418 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7315,9 +7315,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.1.0" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c24f1ab82d336e09f5f1094a4d9227c99ac26cce263bfdf8136897cc6db6f1d0" +checksum = "d3889b392db6d32a105d3757230ea0220090b8f94c90d3e60b6c5eb91178ab1b" dependencies = [ "anyhow", "bytes", @@ -7353,7 +7353,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.2", + "thiserror 1.0.63", "tokio", "tray-icon", "url", @@ -7565,9 +7565,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" +checksum = "a1ef7363e7229ac8d04e8a5d405670dbd43dde8fc4bc3bc56105c35452d03784" dependencies = [ "dpi", "gtk", @@ -7577,16 +7577,16 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror 2.0.2", + "thiserror 1.0.63", "url", "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" +checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" dependencies = [ "gtk", "http 1.1.0", @@ -9262,13 +9262,12 @@ dependencies = [ [[package]] name = "wry" -version = "0.47.0" +version = "0.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553ca1ce149982123962fac2506aa75b8b76288779a77e72b12fa2fc34938647" +checksum = "2f8c948dc5f7c23bd93ba03b85b7f679852589bb78e150424d993171e4ef7b73" dependencies = [ "base64 0.22.1", "block2", - "cookie", "crossbeam-channel", "dpi", "dunce", @@ -9293,7 +9292,6 @@ dependencies = [ "soup3", "tao-macros", "thiserror 1.0.63", - "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", diff --git a/easytier-gui/package.json b/easytier-gui/package.json index 3f61cc4..fc2c0b4 100644 --- a/easytier-gui/package.json +++ b/easytier-gui/package.json @@ -35,14 +35,16 @@ "@primevue/auto-import-resolver": "^4.1.0", "@tauri-apps/api": "2.1.0", "@tauri-apps/cli": "2.1.0", + "@types/default-gateway": "^7.2.2", "@types/node": "^22.7.4", "@types/uuid": "^10.0.0", "@vitejs/plugin-vue": "^5.1.4", "@vue-macros/volar": "0.30.5", "autoprefixer": "^10.4.20", + "cidr-tools": "^11.0.2", + "default-gateway": "^7.2.2", "eslint": "^9.12.0", "eslint-plugin-format": "^0.1.2", - "internal-ip": "^8.0.0", "postcss": "^8.4.47", "tailwindcss": "^3.4.13", "typescript": "^5.6.2", @@ -58,4 +60,4 @@ "vue-i18n": "^10.0.0", "vue-tsc": "^2.1.10" } -} +} \ No newline at end of file diff --git a/easytier-gui/src-tauri/Cargo.toml b/easytier-gui/src-tauri/Cargo.toml index bf94a35..d1b1fa7 100644 --- a/easytier-gui/src-tauri/Cargo.toml +++ b/easytier-gui/src-tauri/Cargo.toml @@ -15,7 +15,8 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2.0.0-rc", features = [] } [dependencies] -tauri = { version = "2.1", features = [ +# wry 0.47 may crash on android, see https://github.com/EasyTier/EasyTier/issues/527 +tauri = { version = "=2.0.6", features = [ "tray-icon", "image-png", "image-ico", diff --git a/easytier-gui/src-tauri/capabilities/migrated.json b/easytier-gui/src-tauri/capabilities/migrated.json index 86c761a..7a29e5c 100644 --- a/easytier-gui/src-tauri/capabilities/migrated.json +++ b/easytier-gui/src-tauri/capabilities/migrated.json @@ -39,7 +39,7 @@ "vpnservice:allow-prepare-vpn", "vpnservice:allow-start-vpn", "vpnservice:allow-stop-vpn", - "vpnservice:allow-register-listener", + "vpnservice:allow-registerListener", "os:default", "os:allow-os-type", "os:allow-arch", diff --git a/easytier-gui/src-tauri/src/lib.rs b/easytier-gui/src-tauri/src/lib.rs index cbf9589..5d5406c 100644 --- a/easytier-gui/src-tauri/src/lib.rs +++ b/easytier-gui/src-tauri/src/lib.rs @@ -141,7 +141,6 @@ pub fn run() { process::exit(0); } - #[cfg(not(target_os = "android"))] utils::setup_panic_handler(); let mut builder = tauri::Builder::default(); diff --git a/easytier-gui/src/composables/mobile_vpn.ts b/easytier-gui/src/composables/mobile_vpn.ts index 72a7478..5e31a75 100644 --- a/easytier-gui/src/composables/mobile_vpn.ts +++ b/easytier-gui/src/composables/mobile_vpn.ts @@ -49,9 +49,9 @@ async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) { return } - console.log('start vpn') + console.log('start vpn service', ipv4Addr, cidr, routes) const start_ret = await start_vpn({ - ipv4Addr: `${ipv4Addr}`, + ipv4Addr: `${ipv4Addr}/${cidr}`, routes, disallowedApplications: ['com.kkrainbow.easytier'], mtu: 1300, @@ -113,6 +113,7 @@ function getRoutesForVpn(routes: Route[]): string[] { } async function onNetworkInstanceChange() { + console.error('vpn service watch network instance change ids', JSON.stringify(networkStore.networkInstanceIds)) const insts = networkStore.networkInstanceIds if (!insts) { await doStopVpn() @@ -142,7 +143,7 @@ async function onNetworkInstanceChange() { const routesChanged = JSON.stringify(routes) !== JSON.stringify(curVpnStatus.routes) if (ipChanged || routesChanged) { - console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip) + console.info('vpn service virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip) try { await doStopVpn() } @@ -154,7 +155,7 @@ async function onNetworkInstanceChange() { await doStartVpn(virtual_ip, 24, routes) } catch (e) { - console.error('start vpn failed, clear all network insts.', e) + console.error('start vpn service failed, clear all network insts.', e) networkStore.clearNetworkInstances() await retainNetworkInstance(networkStore.networkInstanceIds) } @@ -175,6 +176,7 @@ async function watchNetworkInstance() { } subscribe_running = false }) + console.error('vpn service watch network instance') } export async function initMobileVpnService() { diff --git a/easytier-gui/src/pages/index.vue b/easytier-gui/src/pages/index.vue index d43b5e7..0ba8b26 100644 --- a/easytier-gui/src/pages/index.vue +++ b/easytier-gui/src/pages/index.vue @@ -250,7 +250,12 @@ onBeforeMount(async () => { onMounted(async () => { if (type() === 'android') { - await initMobileVpnService() + try { + await initMobileVpnService() + console.error("easytier init vpn service done") + } catch (e: any) { + console.error("easytier init vpn service failed", e) + } } }) diff --git a/easytier-gui/vite.config.ts b/easytier-gui/vite.config.ts index 187136b..47f1134 100644 --- a/easytier-gui/vite.config.ts +++ b/easytier-gui/vite.config.ts @@ -1,9 +1,11 @@ +import { networkInterfaces } from 'node:os' import path from 'node:path' import process from 'node:process' import VueI18n from '@intlify/unplugin-vue-i18n/vite' import { PrimeVueResolver } from '@primevue/auto-import-resolver' import Vue from '@vitejs/plugin-vue' -import { internalIpV4Sync } from 'internal-ip' +import { containsCidr, parseCidr } from 'cidr-tools' +import { gateway4sync } from 'default-gateway' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import VueMacros from 'unplugin-vue-macros/vite' @@ -13,6 +15,20 @@ import { defineConfig } from 'vite' import VueDevTools from 'vite-plugin-vue-devtools' import Layouts from 'vite-plugin-vue-layouts' +function findIp(gateway: string) { + // Look for the matching interface in all local interfaces + console.log('gateway', gateway) + for (const addresses of Object.values(networkInterfaces())) { + if (!addresses) + continue + for (const { cidr } of addresses) { + if (cidr && containsCidr(cidr, gateway)) { + return parseCidr(cidr).ip + } + } + } +} + const host = process.env.TAURI_DEV_HOST // https://vitejs.dev/config/ @@ -99,10 +115,10 @@ export default defineConfig(async () => ({ }, hmr: host ? { - protocol: 'ws', - host: internalIpV4Sync(), - port: 1430, - } + protocol: 'ws', + host: findIp(gateway4sync().gateway), + port: 1430, + } : undefined, }, })) diff --git a/easytier-web/frontend-lib/src/components/Status.vue b/easytier-web/frontend-lib/src/components/Status.vue index 09a9b6f..2ac54dd 100644 --- a/easytier-web/frontend-lib/src/components/Status.vue +++ b/easytier-web/frontend-lib/src/components/Status.vue @@ -303,7 +303,7 @@ function showEventLogs() {