From 660e6beed09596fdee1f79dff06e8fdb83eeb674 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 15 Jan 2025 10:10:54 +0100 Subject: [PATCH] Fix interface name; switch to ServiceManager on Windows (#375) --- src-tauri/Cargo.lock | 612 ++++++++++-------- src-tauri/Cargo.toml | 9 +- src-tauri/common/Cargo.toml | 2 +- src-tauri/common/src/lib.rs | 15 +- src-tauri/src/commands.rs | 2 +- .../src/log_watcher/service_log_watcher.rs | 12 +- src-tauri/src/service/mod.rs | 123 ++-- src-tauri/src/utils.rs | 360 ++++------- 8 files changed, 536 insertions(+), 599 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 62031d5f..90edcf38 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -114,11 +114,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -153,6 +154,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ashpd" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" +dependencies = [ + "async-fs 2.1.2", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.8.5", + "serde", + "serde_repr", + "url", + "zbus 5.3.0", +] + [[package]] name = "async-broadcast" version = "0.5.1" @@ -175,6 +194,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + [[package]] name = "async-channel" version = "2.3.1" @@ -196,7 +226,7 @@ dependencies = [ "async-task", "concurrent-queue", "fastrand 2.3.0", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "slab", ] @@ -220,7 +250,22 @@ checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock 3.4.0", "blocking", - "futures-lite 2.5.0", + "futures-lite 2.6.0", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io 2.4.0", + "async-lock 3.4.0", + "blocking", + "futures-lite 2.6.0", + "once_cell", ] [[package]] @@ -253,7 +298,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "parking", "polling 3.7.4", "rustix 0.38.43", @@ -282,6 +327,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io 2.4.0", + "blocking", + "futures-lite 2.6.0", +] + [[package]] name = "async-process" version = "1.8.1" @@ -305,7 +361,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "async-channel", + "async-channel 2.3.1", "async-io 2.4.0", "async-lock 3.4.0", "async-signal", @@ -313,7 +369,7 @@ dependencies = [ "blocking", "cfg-if", "event-listener 5.4.0", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "rustix 0.38.43", "tracing", ] @@ -326,7 +382,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -347,6 +403,32 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io 2.4.0", + "async-lock 3.4.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -366,7 +448,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -383,7 +465,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -534,9 +616,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" dependencies = [ "serde", ] @@ -583,18 +665,18 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ - "async-channel", + "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "piper", ] [[package]] name = "borsh" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" +checksum = "9fb65153674e51d3a42c8f27b05b9508cea85edfaade8aa46bc8fc18cecdfef3" dependencies = [ "borsh-derive", "cfg_aliases 0.2.1", @@ -602,22 +684,22 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" +checksum = "a396e17ad94059c650db3d253bb6e25927f1eb462eede7e7a153bb6e75dce0a7" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -746,9 +828,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.7" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" dependencies = [ "jobserver", "libc", @@ -826,9 +908,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -836,9 +918,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -855,7 +937,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1181,7 +1263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1191,7 +1273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1218,23 +1300,21 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] name = "dark-light" -version = "1.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" +checksum = "18e1a09f280e29a8b00bc7e81eca5ac87dca0575639c9422a5fa25a07bb884b8" dependencies = [ - "dconf_rs", - "detect-desktop-environment", - "dirs", - "objc", - "rust-ini 0.18.0", + "ashpd", + "async-std", + "objc2", + "objc2-foundation", "web-sys", - "winreg 0.10.1", - "zbus 4.4.0", + "winreg 0.52.0", ] [[package]] @@ -1258,7 +1338,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1269,15 +1349,9 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.95", + "syn 2.0.96", ] -[[package]] -name = "dconf_rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" - [[package]] name = "defguard-client" version = "1.1.1" @@ -1297,7 +1371,7 @@ dependencies = [ "prost-build", "regex", "reqwest 0.12.12", - "rust-ini 0.21.1", + "rust-ini", "serde", "serde_json", "serde_with", @@ -1309,7 +1383,7 @@ dependencies = [ "tauri-plugin-log", "tauri-plugin-single-instance", "tauri-plugin-window-state", - "thiserror 2.0.9", + "thiserror 2.0.11", "time", "tokio", "tokio-util", @@ -1320,7 +1394,6 @@ dependencies = [ "tracing-subscriber", "vergen-git2", "webbrowser", - "widestring", "winapi", "windows-service", "x25519-dalek", @@ -1339,7 +1412,7 @@ dependencies = [ "reqwest 0.12.12", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", ] @@ -1359,7 +1432,7 @@ dependencies = [ "netlink-sys", "nix 0.29.0", "serde", - "thiserror 2.0.9", + "thiserror 2.0.11", "x25519-dalek", ] @@ -1403,7 +1476,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1424,7 +1497,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1434,7 +1507,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1447,15 +1520,9 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.95", + "syn 2.0.96", ] -[[package]] -name = "detect-desktop-environment" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" - [[package]] name = "digest" version = "0.10.7" @@ -1468,15 +1535,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs-next" version = "2.0.0" @@ -1487,17 +1545,6 @@ dependencies = [ "dirs-sys-next", ] -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1523,7 +1570,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1535,12 +1582,6 @@ dependencies = [ "libloading 0.8.6", ] -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - [[package]] name = "dlv-list" version = "0.5.2" @@ -1654,7 +1695,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1864,7 +1905,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1965,9 +2006,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -1984,7 +2025,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2204,11 +2245,11 @@ dependencies = [ [[package]] name = "git2" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", "libgit2-sys", "log", @@ -2279,6 +2320,18 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "gobject-sys" version = "0.15.10" @@ -2720,9 +2773,9 @@ dependencies = [ [[package]] name = "ico" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" dependencies = [ "byteorder", "png", @@ -2843,7 +2896,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3074,9 +3127,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -3118,6 +3171,15 @@ dependencies = [ "selectors", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -3159,9 +3221,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libgit2-sys" -version = "0.17.0+1.8.1" +version = "0.18.0+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +checksum = "e1a117465e7e1597e8febea8bb0c410f1c7fb93b1e1cddf34363f8390367ffec" dependencies = [ "cc", "libc", @@ -3201,7 +3263,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", "redox_syscall", ] @@ -3399,9 +3461,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", "simd-adler32", @@ -3499,7 +3561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "483325d4bfef65699214858f097d504eb812c38ce7077d165f301ec406c3066e" dependencies = [ "anyhow", - "bitflags 2.6.0", + "bitflags 2.7.0", "byteorder", "libc", "log", @@ -3568,7 +3630,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if", "cfg_aliases 0.1.1", "libc", @@ -3580,7 +3642,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if", "cfg_aliases 0.2.1", "libc", @@ -3605,15 +3667,15 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.11.3" +version = "4.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5134a72dc570b178bff81b01e81ab14a6fcc015391ed4b3b14853090658cd3a3" +checksum = "96ae13fb6065b0865d2310dfa55ce319245052ed95fbbe2bc87c99962c58d73f" dependencies = [ "log", "mac-notification-sys", "serde", "tauri-winrt-notification", - "zbus 4.4.0", + "zbus 5.3.0", ] [[package]] @@ -3752,7 +3814,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "block2", "libc", "objc2", @@ -3768,7 +3830,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "block2", "objc2", "objc2-foundation", @@ -3798,7 +3860,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "block2", "libc", "objc2", @@ -3810,7 +3872,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "block2", "objc2", "objc2-foundation", @@ -3822,7 +3884,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "block2", "objc2", "objc2-foundation", @@ -3868,7 +3930,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3885,7 +3947,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3916,23 +3978,13 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list 0.3.0", - "hashbrown 0.12.3", -] - [[package]] name = "ordered-multimap" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ - "dlv-list 0.5.2", + "dlv-list", "hashbrown 0.14.5", ] @@ -4151,7 +4203,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -4198,7 +4250,7 @@ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -4331,12 +4383,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.27" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -4390,9 +4442,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -4423,7 +4475,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.95", + "syn 2.0.96", "tempfile", ] @@ -4437,7 +4489,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -4620,7 +4672,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", ] [[package]] @@ -4863,16 +4915,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap 0.4.3", -] - [[package]] name = "rust-ini" version = "0.21.1" @@ -4880,7 +4922,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" dependencies = [ "cfg-if", - "ordered-multimap 0.7.3", + "ordered-multimap", "trim-in-place", ] @@ -4935,7 +4977,7 @@ version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4944,9 +4986,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "once_cell", "rustls-pki-types", @@ -5044,7 +5086,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -5107,7 +5149,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5131,7 +5173,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5182,7 +5224,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5204,7 +5246,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5422,7 +5464,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", @@ -5440,7 +5482,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5463,7 +5505,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.95", + "syn 2.0.96", "tempfile", "tokio", "url", @@ -5477,7 +5519,7 @@ checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.7.0", "byteorder", "bytes", "chrono", @@ -5507,7 +5549,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.9", + "thiserror 2.0.11", "tracing", "uuid", "whoami", @@ -5521,7 +5563,7 @@ checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.7.0", "byteorder", "chrono", "crc", @@ -5546,7 +5588,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.9", + "thiserror 2.0.11", "tracing", "uuid", "whoami", @@ -5643,22 +5685,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "struct-patch" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82dd71e677fa313d07db38f4c7f9a38f89dfb90be8f35914956919f6ca7b9174" +checksum = "cde1b55ce4b9efe4b5c302dea2d0f1297a522963024e160a587a2670c24f3f04" dependencies = [ "struct-patch-derive", ] [[package]] name = "struct-patch-derive" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4596646090f0d724e6c7f3b65d694f99a0daa1a5893a78ef83887025e041405c" +checksum = "ac94fea04bf721f57ed7f421e64d3a04858e15708d00e8aa814cad7507427503" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5680,7 +5722,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5702,9 +5744,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.95" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -5734,7 +5776,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5754,7 +5796,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation 0.9.4", "system-configuration-sys 0.6.0", ] @@ -5862,7 +5904,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -5890,9 +5932,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf327e247698d3f39af8aa99401c9708384290d1f5c544bf5d251d44c2fea22" +checksum = "e1be4ef682d128826ba4bce70a5cd18b7f5c5803e347835a2c6fed2d6ef3a690" dependencies = [ "anyhow", "bytes", @@ -5947,9 +5989,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "586f3e677f940c8bb4f70c52eda05dc59b79e61543f1182de83516810bb8e35d" +checksum = "2db08694eec06f53625cfc6fff3a363e084e5e9a238166d2989996413c346453" dependencies = [ "anyhow", "cargo_toml", @@ -5966,9 +6008,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a9e3f5cebf779a63bf24903e714ec91196c307d8249a0008b882424328bcda" +checksum = "53438d78c4a037ffe5eafa19e447eea599bedfb10844cb08ec53c2471ac3ac3f" dependencies = [ "base64 0.21.7", "brotli", @@ -5991,9 +6033,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d0e989f54fe06c5ef0875c5e19cf96453d099a0a774d5192ab47e80471cdab" +checksum = "233988ac08c1ed3fe794cd65528d48d8f7ed4ab3895ca64cdaa6ad4d00c45c0b" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -6006,7 +6048,7 @@ dependencies = [ [[package]] name = "tauri-plugin-log" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#f00ad730af8373d8329347d7561ec5486f09ce87" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#fbe729cc4a43a68a0fc2244120abd81f4ec44f04" dependencies = [ "byte-unit", "fern", @@ -6021,7 +6063,7 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#f00ad730af8373d8329347d7561ec5486f09ce87" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#fbe729cc4a43a68a0fc2244120abd81f4ec44f04" dependencies = [ "log", "serde", @@ -6035,10 +6077,10 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" version = "0.1.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#f00ad730af8373d8329347d7561ec5486f09ce87" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#fbe729cc4a43a68a0fc2244120abd81f4ec44f04" dependencies = [ "bincode", - "bitflags 2.6.0", + "bitflags 2.7.0", "log", "serde", "serde_json", @@ -6048,9 +6090,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33fda7d213e239077fad52e96c6b734cecedb30c2382118b64f94cb5103ff3a" +checksum = "8066855882f00172935e3fa7d945126580c34dcbabab43f5d4f0c2398a67d47b" dependencies = [ "gtk", "http 0.2.12", @@ -6069,9 +6111,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.10" +version = "0.14.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18c447dcd9b0f09c7dc4b752cc33e72788805bfd761fbda5692d30c48289efec" +checksum = "ce361fec1e186705371f1c64ae9dd2a3a6768bc530d0a2d5e75a634bb416ad4d" dependencies = [ "arboard", "cocoa", @@ -6090,9 +6132,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0c939e88d82903a0a7dfb28388b12a3c03504d6bd6086550edaa3b6d8beaa" +checksum = "c357952645e679de02cd35007190fcbce869b93ffc61b029f33fe02648453774" dependencies = [ "brotli", "ctor", @@ -6181,11 +6223,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.11", ] [[package]] @@ -6196,18 +6238,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -6300,9 +6342,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -6318,13 +6360,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -6436,7 +6478,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.22", + "winnow 0.6.24", ] [[package]] @@ -6480,7 +6522,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -6562,7 +6604,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -6742,9 +6784,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" dependencies = [ "getrandom 0.2.15", ] @@ -6769,9 +6811,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "9.0.2" +version = "9.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f25fc8f8f05df455c7941e87f093ad22522a9ff33d7a027774815acf6f0639" +checksum = "e0d2f179f8075b805a43a2a21728a46f0cc2921b3c58695b28fa8817e103cd9a" dependencies = [ "anyhow", "derive_builder", @@ -6782,9 +6824,9 @@ dependencies = [ [[package]] name = "vergen-git2" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e63e069d8749fead1e3bab7a9d79e8fb90516b2ec66fc2243a798ecdc1a31d7" +checksum = "d86bae87104cb2790cdee615c2bb54729804d307191732ab27b1c5357ea6ddc5" dependencies = [ "anyhow", "derive_builder", @@ -6797,9 +6839,9 @@ dependencies = [ [[package]] name = "vergen-lib" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c767e6751c09fc85cde58722cf2f1007e80e4c8d5a4321fc90d83dc54ca147" +checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" dependencies = [ "anyhow", "derive_builder", @@ -6889,34 +6931,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -6927,9 +6970,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6937,22 +6980,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -6987,7 +7033,7 @@ version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "rustix 0.38.43", "wayland-backend", "wayland-scanner", @@ -6999,7 +7045,7 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7011,7 +7057,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7042,9 +7088,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -7301,7 +7347,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -7312,7 +7358,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -7356,7 +7402,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24d6bcc7f734a4091ecf8d7a64c5f7d7066f45585c1861eba06449909609c8a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "widestring", "windows-sys 0.52.0", ] @@ -7735,22 +7781,13 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.22" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - [[package]] name = "winreg" version = "0.50.0" @@ -7941,7 +7978,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "synstructure", ] @@ -7988,9 +8025,9 @@ dependencies = [ [[package]] name = "zbus" -version = "4.4.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +checksum = "192a0d989036cd60a1e91a54c9851fb9ad5bd96125d41803eed79d2e2ef74bd7" dependencies = [ "async-broadcast 0.7.2", "async-executor", @@ -8005,23 +8042,21 @@ dependencies = [ "enumflags2", "event-listener 5.4.0", "futures-core", - "futures-sink", "futures-util", "hex", "nix 0.29.0", "ordered-stream", - "rand 0.8.5", "serde", "serde_repr", - "sha1", "static_assertions", "tracing", "uds_windows", - "windows-sys 0.52.0", + "windows-sys 0.59.0", + "winnow 0.6.24", "xdg-home", - "zbus_macros 4.4.0", - "zbus_names 3.0.0", - "zvariant 4.2.0", + "zbus_macros 5.3.0", + "zbus_names 4.1.1", + "zvariant 5.2.0", ] [[package]] @@ -8040,15 +8075,17 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.4.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "3685b5c81fce630efc3e143a4ded235b107f1b1cdf186c3f115529e5e5ae4265" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.95", - "zvariant_utils 2.1.0", + "syn 2.0.96", + "zbus_names 4.1.1", + "zvariant 5.2.0", + "zvariant_utils 3.1.0", ] [[package]] @@ -8064,13 +8101,14 @@ dependencies = [ [[package]] name = "zbus_names" -version = "3.0.0" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +checksum = "519629a3f80976d89c575895b05677cbc45eaf9f70d62a364d819ba646409cc8" dependencies = [ "serde", "static_assertions", - "zvariant 4.2.0", + "winnow 0.6.24", + "zvariant 5.2.0", ] [[package]] @@ -8091,7 +8129,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -8111,7 +8149,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "synstructure", ] @@ -8132,7 +8170,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -8154,7 +8192,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -8173,15 +8211,18 @@ dependencies = [ [[package]] name = "zvariant" -version = "4.2.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +checksum = "55e6b9b5f1361de2d5e7d9fd1ee5f6f7fcb6060618a1f82f3472f58f2b8d4be9" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", - "zvariant_derive 4.2.0", + "url", + "winnow 0.6.24", + "zvariant_derive 5.2.0", + "zvariant_utils 3.1.0", ] [[package]] @@ -8199,15 +8240,15 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "4.2.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.95", - "zvariant_utils 2.1.0", + "syn 2.0.96", + "zvariant_utils 3.1.0", ] [[package]] @@ -8223,11 +8264,14 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "2.1.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +checksum = "ddd46446ea2a1f353bfda53e35f17633afa79f4fe290a611c94645c69fe96a50" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "serde", + "static_assertions", + "syn 2.0.96", + "winnow 0.6.24", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 9e2df29c..2d668469 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -37,7 +37,7 @@ base64 = "0.22" clap = { version = "4.5", features = ["cargo", "derive", "env"] } chrono = { version = "0.4", features = ["serde"] } common = { path = "common" } -dark-light = "1.1" +dark-light = "2.0" defguard_wireguard_rs = { workspace = true } dirs-next = "2.0" lazy_static = "1.5" @@ -87,12 +87,11 @@ x25519-dalek = { version = "2", features = [ "static_secrets", ] } -[target.'cfg(target_os = "windows")'.dependencies] -windows-service = "0.7" +[target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["winsvc", "winerror"] } -widestring = "1.1" +windows-service = "0.7" -[target.'cfg(target_os = "macos")'.dependencies] +[target.'cfg(unix)'.dependencies] nix = { version = "0.29", features = ["net"] } [features] diff --git a/src-tauri/common/Cargo.toml b/src-tauri/common/Cargo.toml index ab51bc72..f561eae7 100644 --- a/src-tauri/common/Cargo.toml +++ b/src-tauri/common/Cargo.toml @@ -6,5 +6,5 @@ rust-version = "1.80" [dependencies] -[target.'cfg(target_os = "macos")'.dependencies] +[target.'cfg(unix)'.dependencies] nix = { version = "0.29", features = ["net"] } diff --git a/src-tauri/common/src/lib.rs b/src-tauri/common/src/lib.rs index 58a848bb..bd4a0117 100644 --- a/src-tauri/common/src/lib.rs +++ b/src-tauri/common/src/lib.rs @@ -11,13 +11,18 @@ pub fn find_free_tcp_port() -> Option { .map(|local_addr| local_addr.port()) } -#[cfg(target_os = "macos")] -/// Find next available `utun` interface. +#[cfg(not(windows))] +/// Find next available interface. On macOS, search for available `utun` interface. +/// On other UNIX, search for available `wg` interface. #[must_use] pub fn get_interface_name(_name: &str) -> String { + #[cfg(target_os = "macos")] + let base_ifname = "utun"; + #[cfg(not(target_os = "macos"))] + let base_ifname = "wg"; if let Ok(interfaces) = nix::net::if_::if_nameindex() { for index in 0..=u16::MAX { - let ifname = format!("utun{index}"); + let ifname = format!("{base_ifname}{index}"); if !interfaces .iter() .any(|interface| interface.name().to_string_lossy() == ifname) @@ -27,11 +32,11 @@ pub fn get_interface_name(_name: &str) -> String { } } - "utun0".into() + format!("{base_ifname}0") } /// Strips location name of all non-alphanumeric characters returning usable interface name. -#[cfg(not(target_os = "macos"))] +#[cfg(windows)] #[must_use] pub fn get_interface_name(name: &str) -> String { name.chars().filter(|c| c.is_alphanumeric()).collect() diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 98fc3212..5b50f87f 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -45,7 +45,7 @@ use crate::{ }; #[derive(Clone, Serialize)] -pub struct Payload { +pub(crate) struct Payload { pub message: String, } diff --git a/src-tauri/src/log_watcher/service_log_watcher.rs b/src-tauri/src/log_watcher/service_log_watcher.rs index fbc297ba..af119eba 100644 --- a/src-tauri/src/log_watcher/service_log_watcher.rs +++ b/src-tauri/src/log_watcher/service_log_watcher.rs @@ -230,7 +230,10 @@ pub async fn spawn_log_watcher_task( "Location" }; let event_topic = format!("log-update-{connection_type_str}-{location_id}"); - debug!("Using the following event topic for the service log watcher for communicating with the frontend: {event_topic}"); + debug!( + "Using the following event topic for the service log watcher for communicating with the \ + frontend: {event_topic}" + ); // explicitly clone before topic is moved into the closure let topic_clone = event_topic.clone(); @@ -273,8 +276,11 @@ pub async fn spawn_log_watcher_task( } let name = get_tunnel_or_location_name(location_id, connection_type, &app_state).await; - info!("A background task has been spawned to watch the defguard service log file for {connection_type} {name} (interface {interface_name}), \ - location's specific collected logs will be displayed in the {connection_type}'s detailed view."); + info!( + "A background task has been spawned to watch the defguard service log file for \ + {connection_type} {name} (interface {interface_name}), location's specific collected logs \ + will be displayed in the {connection_type}'s detailed view." + ); Ok(event_topic) } diff --git a/src-tauri/src/service/mod.rs b/src-tauri/src/service/mod.rs index b1121f64..84f08b12 100644 --- a/src-tauri/src/service/mod.rs +++ b/src-tauri/src/service/mod.rs @@ -122,8 +122,8 @@ impl DesktopDaemonService for DaemonService { debug!("Done creating a new interface {ifname}"); } - // The WireGuard DNS config value can be a list of IP addresses and domain names, which will be - // used as DNS servers and search domains respectively. + // The WireGuard DNS config value can be a list of IP addresses and domain names, which will + // be used as DNS servers and search domains respectively. debug!("Preparing DNS configuration for interface {ifname}"); let dns_string = request.dns.unwrap_or_default(); let dns_entries = dns_string.split(',').map(str::trim).collect::>(); @@ -137,7 +137,10 @@ impl DesktopDaemonService for DaemonService { search_domains.push(entry); } } - debug!("DNS configuration for interface {ifname}: DNS: {dns:?}, Search domains: {search_domains:?}"); + debug!( + "DNS configuration for interface {ifname}: DNS: {dns:?}, Search domains: \ + {search_domains:?}" + ); #[cfg(not(windows))] let configure_interface_result = wgapi.configure_interface(&config); @@ -161,9 +164,15 @@ impl DesktopDaemonService for DaemonService { })?; if dns.is_empty() { - debug!("No DNS configuration provided for interface {ifname}, skipping DNS configuration"); + debug!( + "No DNS configuration provided for interface {ifname}, skipping DNS \ + configuration" + ); } else { - debug!("The following DNS servers will be set: {dns:?}, search domains: {search_domains:?}"); + debug!( + "The following DNS servers will be set: {dns:?}, search domains: \ + {search_domains:?}" + ); wgapi.configure_dns(&dns, &search_domains).map_err(|err| { let msg = format!("Failed to configure DNS for WireGuard interface {ifname}: {err}"); @@ -221,7 +230,8 @@ impl DesktopDaemonService for DaemonService { let request = request.into_inner(); let ifname = request.interface_name; debug!( - "Received a request to start a new network usage stats data stream for interface {ifname}" + "Received a request to start a new network usage stats data stream for interface \ + {ifname}" ); let span = info_span!("read_interface_data", interface_name = &ifname); @@ -234,58 +244,73 @@ impl DesktopDaemonService for DaemonService { info!("Spawning statistics collector task for interface {ifname}"); }); - tokio::spawn(async move { - // Helper map to track if peer data is actually changing to avoid sending duplicate stats. - let mut peer_map = HashMap::new(); - - loop { - // Loop delay - interval.tick().await; - debug!("Gathering network usage statistics for client's network activity on {ifname}"); - match wgapi.read_interface_data() { - Ok(mut host) => { - let peers = &mut host.peers; - debug!( - "Found {} peers configured on WireGuard interface", - peers.len() - ); - // Filter out never connected peers. - peers.retain(|_, peer| { - // Last handshake time-stamp must exist... - if let Some(last_hs) = peer.last_handshake { - // ...and not be UNIX epoch. - if last_hs != SystemTime::UNIX_EPOCH && - match peer_map.get(&peer.public_key) { - Some(last_peer) => last_peer != peer, - None => true, - } { - debug!("Peer {} statistics changed; keeping it.", peer.public_key); - peer_map.insert(peer.public_key.clone(), peer.clone()); - return true; + tokio::spawn( + async move { + // Helper map to track if peer data is actually changing to avoid sending duplicate + // stats. + let mut peer_map = HashMap::new(); + + loop { + // Loop delay + interval.tick().await; + debug!( + "Gathering network usage statistics for client's network activity on {ifname}"); + match wgapi.read_interface_data() { + Ok(mut host) => { + let peers = &mut host.peers; + debug!( + "Found {} peers configured on WireGuard interface", + peers.len() + ); + // Filter out never connected peers. + peers.retain(|_, peer| { + // Last handshake time-stamp must exist... + if let Some(last_hs) = peer.last_handshake { + // ...and not be UNIX epoch. + if last_hs != SystemTime::UNIX_EPOCH + && match peer_map.get(&peer.public_key) { + Some(last_peer) => last_peer != peer, + None => true, + } + { + debug!( + "Peer {} statistics changed; keeping it.", + peer.public_key + ); + peer_map.insert(peer.public_key.clone(), peer.clone()); + return true; + } } + debug!( + "Peer {} statistics didn't change; ignoring it.", + peer.public_key + ); + false + }); + if let Err(err) = tx.send(Ok(host.into())).await { + error!( + "Couldn't send network usage stats update for {ifname}: {err}" + ); + break; } - debug!("Peer {} statistics didn't change; ignoring it.", peer.public_key); - false - }); - if let Err(err) = tx.send(Ok(host.into())).await { + } + Err(err) => { error!( - "Couldn't send network usage stats update for {ifname}: {err}" + "Failed to retrieve network usage stats for interface {ifname}: \ + {err}" ); break; } } - Err(err) => { - error!("Failed to retrieve network usage stats for interface {ifname}: {err}"); - break; - } + debug!("Network activity statistics for interface {ifname} sent to the client"); } - debug!("Network activity statistics for interface {ifname} sent to the client"); - } - debug!( - "The client has disconnected from the network usage statistics data stream \ + debug!( + "The client has disconnected from the network usage statistics data stream \ for interface {ifname}, stopping the statistics data collection task." - ); - }.instrument(span)); + ); + } + .instrument(span), + ); let output_stream = ReceiverStream::new(rx); Ok(Response::new( diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index f569e616..16e403d1 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -31,19 +31,11 @@ use crate::{ ConnectionType, }; #[cfg(target_os = "windows")] -use std::ptr::null_mut; +use winapi::shared::winerror::ERROR_SERVICE_DOES_NOT_EXIST; #[cfg(target_os = "windows")] -use widestring::U16CString; -#[cfg(target_os = "windows")] -use winapi::{ - shared::{minwindef::DWORD, winerror::ERROR_SERVICE_DOES_NOT_EXIST}, - um::{ - errhandlingapi::GetLastError, - winsvc::{ - CloseServiceHandle, OpenSCManagerW, OpenServiceW, QueryServiceStatus, SC_HANDLE__, - SC_MANAGER_CONNECT, SERVICE_QUERY_STATUS, SERVICE_RUNNING, - }, - }, +use windows_service::{ + service::{ServiceAccess, ServiceState}, + service_manager::{ServiceManager, ServiceManagerAccess}, }; pub(crate) static DEFAULT_ROUTE_IPV4: &str = "0.0.0.0/0"; @@ -757,8 +749,8 @@ pub(crate) async fn disconnect_interface( ); let _ = execute_command(pre_down); info!( - "Executed defined PreDown command before setting up the interface {} for \ - the tunnel {tunnel}: {pre_down}", + "Executed defined PreDown command before setting up the interface {} for the \ + tunnel {tunnel}: {pre_down}", active_connection.interface_name ); } @@ -837,72 +829,97 @@ pub async fn get_tunnel_or_location_name( } } +// Check if location/tunnel is connected and WireGuard Windows service is running. +// `id`: location or tunnel Id +// `name`: location or tunnel name #[cfg(target_os = "windows")] -fn open_service_manager() -> Result<*mut SC_HANDLE__, DWORD> { - let sc_manager_handle = unsafe { OpenSCManagerW(null_mut(), null_mut(), SC_MANAGER_CONNECT) }; - if sc_manager_handle.is_null() { - Err(unsafe { GetLastError() }) - } else { - Ok(sc_manager_handle) - } -} - -#[cfg(target_os = "windows")] -fn open_service( - sc_manager_handle: *mut SC_HANDLE__, - service_name: &str, - desired_access: DWORD, -) -> Result<*mut SC_HANDLE__, DWORD> { - let service_name_wstr = match U16CString::from_str(service_name) { - Ok(service_name_wstr) => service_name_wstr, +async fn check_connection( + service_manager: &ServiceManager, + id: Id, + name: &str, + connection_type: ConnectionType, + app_handle: AppHandle, +) -> Result<(), Error> { + let appstate = app_handle.state::(); + let interface_name = get_interface_name(name); + let service_name = format!("WireGuardTunnel${}", name); + let service = match service_manager.open_service(&service_name, ServiceAccess::QUERY_CONFIG) { + Ok(service) => service, + Err(windows_service::Error::Winapi(err)) + if err.raw_os_error() == Some(ERROR_SERVICE_DOES_NOT_EXIST as i32) => + { + debug!("WireGuard tunnel {interface_name} is not installed, nothing to synchronize"); + return Ok(()); + } Err(err) => { - error!( - "Failed to convert service name {} to a wide string: {err}", - service_name + warn!( + "Failed to open service {service_name} for interface {interface_name} while \ + synchronizing active connections. This may cause the {connection_type} {name} \ + state to display incorrectly in the client. Reconnect to it manually to fix it. \ + Error: {err}" ); - return Err(1); + return Ok(()); } }; - let service_handle = unsafe { - OpenServiceW( - sc_manager_handle, - service_name_wstr.as_ptr(), - desired_access, - ) - }; - if service_handle.is_null() { - Err(unsafe { GetLastError() }) - } else { - Ok(service_handle) + match service.query_status() { + Ok(status) => { + // Only point where we don't return and continue with the rest of the code below. + if status.current_state == ServiceState::Running { + debug!("WireGuard tunnel {interface_name} is running."); + } else { + debug!( + "WireGuard tunnel {interface_name} is not running, status code: {:?}. Refer to \ + Windows documentation for more information about the code.", + status.current_state + ); + return Ok(()); + } + } + Err(err) => { + warn!( + "Failed to query service status for interface {interface_name} while synchronizing \ + active connections. This may cause the {connection_type} {name} state to display \ + incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", + ); + return Ok(()); + } } -} -#[cfg(target_os = "windows")] -fn get_service_status(service_handle: *mut SC_HANDLE__) -> Result { - let mut service_status = unsafe { std::mem::zeroed() }; - let result = unsafe { QueryServiceStatus(service_handle, &mut service_status) }; - if result == 0 { - Err(unsafe { GetLastError() }) - } else { - Ok(service_status.dwCurrentState) + if appstate + .find_connection(id, connection_type) + .await + .is_some() + { + debug!("{connection_type} {name} has already a connected state, skipping synchronization"); + return Ok(()); } -} -#[cfg(target_os = "windows")] -fn close_service_handle( - service_handle: *mut SC_HANDLE__, - service_name: &str, -) -> Result { - let result = unsafe { CloseServiceHandle(service_handle) }; - if result == 0 { - let error = unsafe { GetLastError() }; - Err(Error::InternalError(format!( - "Failed to close service handle for service {service_name}, error code: {error}", - ))) - } else { - info!("Service handle closed successfully"); - Ok(result) - } + appstate + .add_connection(id, &interface_name, connection_type) + .await; + + debug!("Sending event informing the frontend that a new connection has been created."); + app_handle.emit_all( + CONNECTION_CHANGED, + Payload { + message: "Created new connection".into(), + }, + )?; + debug!("Event informing the frontend that a new connection has been created sent."); + + debug!("Spawning service log watcher for {connection_type} {name}..."); + spawn_log_watcher_task( + app_handle.clone(), + id, + interface_name, + connection_type, + Level::DEBUG, + None, + ) + .await?; + debug!("Service log watcher for {connection_type} {name} spawned."); + + Ok(()) } // TODO: Move the connection handling to a seperate, common function, @@ -913,208 +930,49 @@ pub async fn sync_connections(app_handle: &AppHandle) -> Result<(), Error> { debug!("Synchronizing active connections with the systems' state..."); let appstate = app_handle.state::(); let all_locations = Location::all(&appstate.db).await?; - let service_control_manager = open_service_manager().map_err(|err| { - error!( + let service_manager = + ServiceManager::local_computer(None::<&str>, ServiceManagerAccess::CONNECT).map_err( + |err| { + error!( "Failed to open service control manager while trying to sync client's connections \ with the host state: {err}" ); - Error::InternalError( - "Failed to open service control manager while trying to sync client's + Error::InternalError( + "Failed to open service control manager while trying to sync client's connections with the host state" - .to_string(), - ) - })?; - - debug!("Opened service control manager, starting to synchronize active connections for locations..."); - // Go through all locations and check if they are connected (if the windows service is running) - // If we encounter any errors, continue with the next iteration of the loop, it's not a big deal - // if we skip some locations, as the user can always reconnect to them manually - for location in all_locations { - let interface_name = get_interface_name(&location.name); - let service_name = format!("WireGuardTunnel${}", interface_name); - let service = match open_service( - service_control_manager, - &service_name, - SERVICE_QUERY_STATUS, - ) { - Ok(service) => service, - Err(err) => match err { - ERROR_SERVICE_DOES_NOT_EXIST => { - debug!( - "WireGuard tunnel {} is not installed, nothing to synchronize", - interface_name - ); - continue; - } - _ => { - warn!( - "Failed to open service {service_name} for interface {interface_name} while \ - synchronizing active connections. This may cause the location {} state to \ - display incorrectly in the client. Reconnect to it manually to fix it. \ - Error: {err}", location.name - ); - continue; - } - }, - }; - match get_service_status(service) { - Ok(status) => { - // Only point where we don't jump to the next iteration of the loop and continue with the rest of the code below the match - close_service_handle(service, &service_name)?; - if status == SERVICE_RUNNING { - debug!("WireGuard tunnel {} is running, ", interface_name); - } else { - debug!( - "WireGuard tunnel {} is not running, status code: {status}. Refer to \ - Windows documentation for more information about the code.", - interface_name - ); - continue; - } - } - Err(err) => { - close_service_handle(service, &service_name)?; - warn!( - "Failed to query service status for interface {} while synchronizing active \ - connections. This may cause the location {} state to display incorrectly in \ - the client. Reconnect to it manually to fix it. Error: {err}", - interface_name, location.name - ); - continue; - } - } - - if appstate - .find_connection(location.id, ConnectionType::Location) - .await - .is_some() - { - debug!( - "Location {} has already a connected state, skipping synchronization", - location.name - ); - continue; - } - - appstate - .add_connection(location.id, &interface_name, ConnectionType::Location) - .await; - - debug!("Sending event informing the frontend that a new connection has been created."); - app_handle.emit_all( - CONNECTION_CHANGED, - Payload { - message: "Created new connection".into(), + .to_string(), + ) }, )?; - debug!("Event informing the frontend that a new connection has been created sent."); - debug!("Spawning service log watcher for location {}...", location); - spawn_log_watcher_task( - app_handle.clone(), + debug!("Opened service control manager. Synchronizing active connections for locations..."); + // Go through all locations and check if they are connected and Windows service is running. + // If we encounter any errors, continue with the next iteration of the loop, it's not a big deal + // if we skip some locations, as the user can always reconnect to them manually. + for location in all_locations { + check_connection( + &service_manager, location.id, - interface_name, + &location.name, ConnectionType::Location, - Level::DEBUG, - None, + app_handle.clone(), ) .await?; - debug!("Service log watcher for location {} spawned.", location); } debug!("Synchronizing active connections for tunnels..."); // Do the same for tunnels for tunnel in Tunnel::all(&appstate.db).await? { - let interface_name = get_interface_name(&tunnel.name); - let service_name = format!("WireGuardTunnel${}", interface_name); - let service = - match open_service(service_control_manager, &service_name, SERVICE_QUERY_STATUS) { - Ok(service) => service, - Err(err) => match err { - ERROR_SERVICE_DOES_NOT_EXIST => { - debug!( - "WireGuard tunnel {} is not installed, nothing to synchronize", - interface_name - ); - continue; - } - _ => { - error!( - "Failed to open service {service_name} for interface {interface_name}. \ - This may cause the tunnel {} state to display incorrectly in the \ - client. Reconnect to it manually to fix it. Error: {err}", - tunnel.name - ); - continue; - } - }, - }; - match get_service_status(service) { - Ok(status) => { - // Only point where we don't jump to the next iteration of the loop and continue with the rest of the code below the match - close_service_handle(service, &service_name)?; - if status == SERVICE_RUNNING { - debug!("WireGuard tunnel {} is running", interface_name); - } else { - debug!( - "WireGuard tunnel {} is not running, status code: {status}. Refer to Windows documentation for more information about the code.", - interface_name - ); - continue; - } - } - Err(err) => { - close_service_handle(service, &service_name)?; - warn!( - "Failed to query service status for interface {}. \ - This may cause the tunnel {} state to display incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", - interface_name, tunnel.name - ); - continue; - } - } - - if appstate - .find_connection(tunnel.id, ConnectionType::Tunnel) - .await - .is_some() - { - debug!( - "Tunnel {} has already a connected state, skipping synchronization", - tunnel.name - ); - continue; - } - - appstate - .add_connection(tunnel.id, &interface_name, ConnectionType::Tunnel) - .await; - - debug!("Sending event informing the frontend that a new connection has been created."); - app_handle.emit_all( - CONNECTION_CHANGED, - Payload { - message: "Created new connection".into(), - }, - )?; - debug!("Event informing the frontend that a new connection has been created sent."); - - //spawn log watcher - debug!("Spawning log watcher for tunnel {}", tunnel.name); - spawn_log_watcher_task( - app_handle.clone(), + check_connection( + &service_manager, tunnel.id, - interface_name, + &tunnel.name, ConnectionType::Tunnel, - Level::DEBUG, - None, + app_handle.clone(), ) .await?; - debug!("Log watcher for tunnel {} spawned", tunnel.name); } - close_service_handle(service_control_manager, "SERVICE_CONTROL_MANAGER")?; - debug!("Active connections synchronized with the system state"); Ok(())