diff --git a/src/core_main.rs b/src/core_main.rs index 7c86bdd19..d159e115e 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -8,12 +8,20 @@ pub fn core_main() -> Option> { let mut args = Vec::new(); let mut i = 0; let mut is_setup = false; + let mut _is_elevate = false; + let mut _is_run_as_system = false; for arg in std::env::args() { // to-do: how to pass to flutter? if i == 0 && crate::common::is_setup(&arg) { is_setup = true; } else if i > 0 { - args.push(arg); + if arg == "--elevate" { + _is_elevate = true; + } else if arg == "--run-as-system" { + _is_run_as_system = true; + } else { + args.push(arg); + } } i += 1; } @@ -60,8 +68,7 @@ pub fn core_main() -> Option> { #[cfg(windows)] #[cfg(not(debug_assertions))] if !crate::platform::is_installed() && args.is_empty() { - let arg = if is_setup { "--noinstall" } else { "" }; - crate::platform::run_check_elevation(arg); + crate::platform::elevate_or_run_as_system(is_setup, _is_elevate, _is_run_as_system); } if args.is_empty() { std::thread::spawn(move || crate::start_server(false)); diff --git a/src/platform/windows.rs b/src/platform/windows.rs index b5a595b5a..10b0dcee6 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -1472,22 +1472,50 @@ pub fn run_as_system(arg: &str) -> ResultType<()> { Ok(()) } -pub fn run_check_elevation(arg: &str) { - if let Ok(false) = is_elevated(None) { - if let Ok(true) = elevate(arg) { - std::process::exit(0); - } else { - // do nothing but prompt - } +pub fn elevate_or_run_as_system(is_setup: bool, is_elevate: bool, is_run_as_system: bool) { + // avoid possible run recursively due to failed run, which hasn't happened yet. + let arg_elevate = if is_setup { + "--noinstall --elevate" } else { + "--elevate" + }; + let arg_run_as_system = if is_setup { + "--noinstall --run-as-system" + } else { + "--run-as-system" + }; + let rerun_as_system = || { if !is_root() { - if run_as_system(arg).is_ok() { + if run_as_system(arg_run_as_system).is_ok() { std::process::exit(0); } else { - // to-do: should not happen log::error!("Failed to run as system"); } } + }; + + if is_elevate { + if !is_elevated(None).map_or(true, |b| b) { + log::error!("Failed to elevate"); + return; + } + rerun_as_system(); + } else if is_run_as_system { + if !is_root() { + log::error!("Failed to be system"); + } + } else { + if let Ok(true) = is_elevated(None) { + // right click + rerun_as_system(); + } else { + // left click || run without install + if let Ok(true) = elevate(arg_elevate) { + std::process::exit(0); + } else { + // do nothing but prompt + } + } } }