diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 94b50a6de991e61a1940d80cc67b432385b7e1f7..9edbb37dea17045e7aef95e564220465a5bd39f8 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -153,12 +162,12 @@ checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" dependencies = [ "async-io", "blocking", - "cfg-if", + "cfg-if 1.0.0", "event-listener", "futures-lite", "libc", "once_cell", - "signal-hook", + "signal-hook 0.3.13", "winapi", ] @@ -233,7 +242,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f0ab475f9b1049a9d4e9c83f45ff27ec3bce4a6cb8e58e7f29030f8992af8c5" dependencies = [ - "dirs", + "dirs 4.0.0", "winreg", ] @@ -243,6 +252,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.5.1", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.0" @@ -450,6 +474,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -482,8 +512,9 @@ dependencies = [ "anyhow", "auto-launch", "chrono", + "deelevate", "delay_timer", - "dirs", + "dirs 4.0.0", "dunce", "log", "log4rs", @@ -492,6 +523,7 @@ dependencies = [ "parking_lot 0.12.0", "port_scanner", "reqwest", + "runas", "serde", "serde_json", "serde_yaml", @@ -499,10 +531,9 @@ dependencies = [ "tauri-build", "tokio", "warp", - "which", + "which 4.2.5", "window-shadows", "window-vibrancy", - "windows-service", "winreg", ] @@ -628,7 +659,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -638,7 +669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a8699d8ed16e3db689f8ae04d8dc3c6666a4ba7e724e5a157884b7cc385d16b" dependencies = [ "chrono", - "nom", + "nom 7.1.1", "once_cell", ] @@ -648,7 +679,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", ] @@ -658,7 +689,7 @@ version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "lazy_static", ] @@ -791,10 +822,24 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "num_cpus", ] +[[package]] +name = "deelevate" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7397f8c48906dd9b5afc75001368c979418e5dff5575998a831eb2319b424e" +dependencies = [ + "lazy_static", + "pathsearch", + "rand 0.8.5", + "shared_library", + "termwiz", + "winapi", +] + [[package]] name = "deflate" version = "0.7.20" @@ -882,6 +927,16 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if 0.1.10", + "dirs-sys", +] + [[package]] name = "dirs" version = "4.0.0" @@ -897,7 +952,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "dirs-sys-next", ] @@ -968,21 +1023,7 @@ version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" dependencies = [ - "cfg-if", -] - -[[package]] -name = "err-derive" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34a887c8df3ed90498c1c437ce21f211c8e27672921a8ffa293cb8d6d4caa9e" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "rustversion", - "syn", - "synstructure", + "cfg-if 1.0.0", ] [[package]] @@ -991,6 +1032,15 @@ version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", +] + [[package]] name = "fastrand" version = "1.7.0" @@ -1010,13 +1060,24 @@ dependencies = [ "rustc_version 0.3.3", ] +[[package]] +name = "filedescriptor" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" +dependencies = [ + "libc", + "thiserror", + "winapi", +] + [[package]] name = "filetime" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall 0.2.12", "winapi", @@ -1028,7 +1089,7 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crc32fast", "libc", "miniz_oxide 0.4.4", @@ -1289,7 +1350,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -1300,11 +1361,17 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.10.0+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + [[package]] name = "gio" version = "0.15.10" @@ -1576,6 +1643,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "html5ever" version = "0.25.2" @@ -1752,7 +1825,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1913,7 +1986,7 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "serde", ] @@ -1956,7 +2029,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "generator", "scoped-tls", "serde", @@ -2024,6 +2097,12 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +[[package]] +name = "memmem" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" + [[package]] name = "memoffset" version = "0.6.5" @@ -2213,6 +2292,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "nom" version = "7.1.1" @@ -2232,6 +2321,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -2332,6 +2432,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.10.0" @@ -2361,7 +2470,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" dependencies = [ "bitflags", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -2464,7 +2573,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall 0.2.12", @@ -2478,7 +2587,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall 0.2.12", "smallvec", @@ -2491,6 +2600,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pathsearch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da983bc5e582ab17179c190b4b66c7d76c5943a69c6d34df2a2b6bf8a2977b05" +dependencies = [ + "anyhow", + "libc", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -2672,7 +2791,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "log", "wepoll-ffi", @@ -2987,6 +3106,22 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148be9baabb59959aeaf4b27597bce9f071511a6a74a4a20a2c5681722a21e" +[[package]] +name = "runas" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a620b0994a180cdfa25c0439e6d58c0628272571501880d626ffff58e96a0799" +dependencies = [ + "cc", + "which 3.1.1", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + [[package]] name = "rustc_version" version = "0.2.3" @@ -3283,7 +3418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -3295,18 +3430,31 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.3", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.3", ] @@ -3330,6 +3478,26 @@ dependencies = [ "winapi", ] +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "signal-hook" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook" version = "0.3.13" @@ -3491,18 +3659,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - [[package]] name = "system-deps" version = "3.2.0" @@ -3595,7 +3751,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "core-foundation-sys", "libc", "objc", @@ -3693,7 +3849,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2", + "sha2 0.10.2", "tauri-utils", "thiserror", "uuid", @@ -3780,7 +3936,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "libc", "redox_syscall 0.2.12", @@ -3799,6 +3955,60 @@ dependencies = [ "utf-8", ] +[[package]] +name = "terminfo" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76971977e6121664ec1b960d1313aacfa75642adc93b9d4d53b247bd4cb1747e" +dependencies = [ + "dirs 2.0.2", + "fnv", + "nom 5.1.2", + "phf 0.8.0", + "phf_codegen", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "termwiz" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ef6892cc0348a9b3b8c377addba91e0f6365863d92354bf27559dca81ee8c5" +dependencies = [ + "anyhow", + "base64", + "bitflags", + "cfg-if 1.0.0", + "filedescriptor", + "hex", + "lazy_static", + "libc", + "log", + "memmem", + "num-derive", + "num-traits", + "ordered-float", + "regex", + "semver 0.11.0", + "sha2 0.9.9", + "signal-hook 0.1.17", + "terminfo", + "termios", + "thiserror", + "ucd-trie", + "unicode-segmentation", + "vtparse", + "winapi", +] + [[package]] name = "thin-slice" version = "0.1.1" @@ -3971,7 +4181,7 @@ version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -4162,6 +4372,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" + [[package]] name = "uuid" version = "0.8.2" @@ -4201,6 +4417,15 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vtparse" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ce903972602c84dd48f488cdce39edcba03a93b7ca67b146ae862568f48c5c" +dependencies = [ + "utf8parse", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -4282,7 +4507,7 @@ version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -4307,7 +4532,7 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -4444,6 +4669,16 @@ dependencies = [ "cc", ] +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "failure", + "libc", +] + [[package]] name = "which" version = "4.2.5" @@ -4455,12 +4690,6 @@ dependencies = [ "libc", ] -[[package]] -name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - [[package]] name = "wildmatch" version = "2.1.0" @@ -4556,18 +4785,6 @@ dependencies = [ "windows_reader", ] -[[package]] -name = "windows-service" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c643e10139d127d30d6d753398c8a6f0a43532e8370f6c9d29ebbff29b984ab" -dependencies = [ - "bitflags", - "err-derive", - "widestring", - "winapi", -] - [[package]] name = "windows-sys" version = "0.32.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 18bad1eff1f29347242ea59cbec09a4615bd7940..0d7246d2a5c2d17f42f19648824bd1a898237cd7 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -38,8 +38,9 @@ auto-launch = "0.2" port_scanner = "0.1.5" [target.'cfg(windows)'.dependencies] +runas = "0.2.1" +deelevate = "0.2.0" winreg = { version = "0.10", features = ["transactions"] } -windows-service = "0.4.0" [features] default = ["custom-protocol"] diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 96b8f4cc09bd1f2d369865932516fe0accb785d7..1b711e7c72e5db608b2d737fedb5912674fec273 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -57,61 +57,6 @@ impl Service { self.start() } - #[cfg(windows)] - pub fn install(&mut self) -> Result<()> { - use std::{env::current_exe, ffi::OsString}; - use windows_service::{ - service::{ServiceAccess, ServiceErrorControl, ServiceInfo, ServiceStartType, ServiceType}, - service_manager::{ServiceManager, ServiceManagerAccess}, - }; - - let manager_access = ServiceManagerAccess::CONNECT | ServiceManagerAccess::CREATE_SERVICE; - let service_manager = ServiceManager::local_computer(None::<&str>, manager_access)?; - - let service_binary_path = current_exe().unwrap().with_file_name("clash.exe"); - - let service_info = ServiceInfo { - name: OsString::from("clash_verge_core"), - display_name: OsString::from("Clash Verge Core"), - service_type: ServiceType::OWN_PROCESS, - start_type: ServiceStartType::OnDemand, - error_control: ServiceErrorControl::Normal, - executable_path: service_binary_path, - launch_arguments: vec![], - dependencies: vec![], - account_name: None, // run as System - account_password: None, - }; - - let service = service_manager.create_service(&service_info, ServiceAccess::CHANGE_CONFIG)?; - service.set_description("Clash Core Service installed by Clash Verge")?; - - Ok(()) - } - - #[cfg(windows)] - pub fn check_status(&mut self) -> Result<String> { - use windows_service::{ - service::{ServiceAccess, ServiceState}, - service_manager::{ServiceManager, ServiceManagerAccess}, - }; - - let manager_access = ServiceManagerAccess::CONNECT; - let service_manager = ServiceManager::local_computer(None::<&str>, manager_access)?; - - let service_access = ServiceAccess::QUERY_STATUS; // | ServiceAccess::STOP | ServiceAccess::DELETE; - let service = service_manager.open_service("clash_verge_core", service_access)?; - - let service_status = service.query_status()?; - - Ok(format!("{:?}", service_status.current_state)) - } - - #[cfg(windows)] - pub fn start_service(&mut self) -> Result<()> { - Ok(()) - } - /// update clash config /// using PUT methods pub fn set_config(&self, info: ClashInfo, config: Mapping, notice: Notice) -> Result<()> { @@ -176,3 +121,91 @@ impl Drop for Service { log_if_err!(self.stop()); } } + +/// ### Service Mode +/// +#[cfg(windows)] +mod win_service { + use super::*; + use deelevate::{PrivilegeLevel, Token}; + use runas::Command as RunasCommond; + use std::process::Command as StdCommond; + + const SERVICE_NAME: &str = "clash_verge_service"; + + impl Service { + /// install the Clash Verge Service (windows only) + pub fn install_service(&mut self) -> Result<()> { + let binary_path = dirs::service_path(); + let arg = format!("binpath={}", binary_path.as_os_str().to_string_lossy()); + + let token = Token::with_current_process()?; + let level = token.privilege_level()?; + + tauri::async_runtime::spawn(async move { + let args = [ + "create", + SERVICE_NAME, + arg.as_str(), + "type=own", + "start=AUTO", + "displayname=Clash Verge Service", + ]; + + let status = match level { + PrivilegeLevel::NotPrivileged => RunasCommond::new("sc").args(&args).status(), + _ => StdCommond::new("sc").args(&args).status(), + }; + + match status { + Ok(status) => { + if status.success() { + log::info!("install clash verge service successfully"); + } else if status.code() == Some(1073i32) { + log::info!("clash verge service is installed"); + } else { + log::error!( + "failed to install service with status {}", + status.code().unwrap() + ); + } + } + Err(err) => log::error!("failed to install service for {err}"), + } + }); + + Ok(()) + } + + /// uninstall + pub fn uninstall_service(&mut self) -> Result<()> { + let token = Token::with_current_process()?; + let level = token.privilege_level()?; + + tauri::async_runtime::spawn(async move { + let args = ["delete", SERVICE_NAME]; + + let status = match level { + PrivilegeLevel::NotPrivileged => RunasCommond::new("sc").args(&args).status(), + _ => StdCommond::new("sc").args(&args).status(), + }; + + match status { + Ok(status) => { + if status.success() { + log::info!("uninstall clash verge service successfully"); + } else { + log::error!( + "failed to uninstall service with status {}", + status.code().unwrap() + ); + } + } + Err(err) => log::error!("failed to uninstall service for {err}"), + } + }); + + Ok(()) + } + } +} diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 9229c55989bba42b0166c534fe6d2060df803fee..cfb3541a5c46a86dc2b4fdceb9f43f8c14b8de58 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -15,6 +15,9 @@ static VERGE_CONFIG: &str = "verge.yaml"; static PROFILE_YAML: &str = "profiles.yaml"; static PROFILE_TEMP: &str = "clash-verge-runtime.yaml"; +#[cfg(windows)] +static mut RESOURCE_DIR: Option<PathBuf> = None; + /// portable flag #[allow(unused)] static mut PORTABLE_FLAG: bool = false; @@ -58,9 +61,16 @@ pub fn app_home_dir() -> PathBuf { /// get the resources dir pub fn app_resources_dir(package_info: &PackageInfo) -> PathBuf { - resource_dir(package_info, &Env::default()) + let res_dir = resource_dir(package_info, &Env::default()) .unwrap() - .join("resources") + .join("resources"); + + #[cfg(windows)] + unsafe { + RESOURCE_DIR = Some(res_dir.clone()); + } + + res_dir } /// profiles dir @@ -92,3 +102,14 @@ pub fn profiles_temp_path() -> PathBuf { #[cfg(feature = "debug-yml")] return app_home_dir().join(PROFILE_TEMP); } + +#[cfg(windows)] +static SERVICE_PATH: &str = "clash-verge-service.exe"; + +#[cfg(windows)] +pub fn service_path() -> PathBuf { + unsafe { + let res_dir = RESOURCE_DIR.clone().unwrap(); + res_dir.join(SERVICE_PATH) + } +}