diff --git a/Cargo.lock b/Cargo.lock index 86b9ef04..4583f6de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,6 +157,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "clap" version = "4.5.20" @@ -445,6 +451,7 @@ dependencies = [ "anstyle", "clap", "linutil_core", + "nix 0.29.0", "oneshot", "portable-pty", "rand", @@ -538,6 +545,18 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -623,7 +642,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix", + "nix 0.25.1", "serial", "shared_library", "shell-words", diff --git a/core/tabs/common-script.sh b/core/tabs/common-script.sh index f8188ac3..1584d3c7 100644 --- a/core/tabs/common-script.sh +++ b/core/tabs/common-script.sh @@ -84,7 +84,13 @@ checkAURHelper() { } checkEscalationTool() { - ## Check for escalation tools. + if [ "$(id -u)" = "0" ]; then + ESCALATION_TOOL="eval" + ESCALATION_TOOL_CHECKED=true + printf "%b\n" "${CYAN}Running as root, no escalation needed${RC}" + return 0 + fi + if [ -z "$ESCALATION_TOOL_CHECKED" ]; then ESCALATION_TOOLS='sudo doas' for tool in ${ESCALATION_TOOLS}; do diff --git a/tui/Cargo.toml b/tui/Cargo.toml index 4051d3b3..f650272c 100644 --- a/tui/Cargo.toml +++ b/tui/Cargo.toml @@ -30,6 +30,7 @@ textwrap = "0.16.1" anstyle = "1.0.8" ansi-to-tui = "7.0.0" zips = "0.1.7" +nix = { version = "0.29.0", features = [ "user" ] } [[bin]] name = "linutil" diff --git a/tui/src/main.rs b/tui/src/main.rs index 7a9f4067..44344fd9 100644 --- a/tui/src/main.rs +++ b/tui/src/main.rs @@ -3,6 +3,7 @@ mod filter; mod float; mod floating_text; mod hint; +mod root; mod running_command; pub mod state; mod theme; @@ -28,6 +29,8 @@ use ratatui::{ }; use state::AppState; +use crate::root::create_app_state; + // Linux utility toolbox #[derive(Debug, Parser)] struct Args { @@ -54,7 +57,7 @@ struct Args { fn main() -> io::Result<()> { let args = Args::parse(); - let mut state = AppState::new( + let mut state = create_app_state( args.config, args.theme, args.override_validation, diff --git a/tui/src/root.rs b/tui/src/root.rs new file mode 100644 index 00000000..96c70651 --- /dev/null +++ b/tui/src/root.rs @@ -0,0 +1,49 @@ +use crate::{ + float::Float, float::FloatContent, floating_text::FloatingText, state::AppState, theme::Theme, +}; +use std::path::PathBuf; + +#[cfg(unix)] +use nix::unistd::Uid; + +pub fn create_app_state( + config_path: Option, + theme: Theme, + override_validation: bool, + size_bypass: bool, + skip_confirmation: bool, +) -> AppState { + #[cfg(unix)] + { + if Uid::effective().is_root() { + let mut state = AppState::new( + config_path, + theme, + override_validation, + size_bypass, + skip_confirmation, + ); + + let warning = FloatingText::new( + "\ + WARNING: You are running this utility as root!\n\n\ + This means you have full system access and commands can potentially damage your system if used incorrectly.\n\n\ + Please proceed with caution and make sure you understand what each script does before executing it.\ + ".into(), + "Root User Warning", + true, + ); + let float: Float = Float::new(Box::new(warning), 60, 40); + state.set_float_window(float); + return state; + } + } + + AppState::new( + config_path, + theme, + override_validation, + size_bypass, + skip_confirmation, + ) +} diff --git a/tui/src/state.rs b/tui/src/state.rs index 5ee34079..a5363d68 100644 --- a/tui/src/state.rs +++ b/tui/src/state.rs @@ -873,6 +873,10 @@ impl AppState { self.current_tab.select(Some(next)); self.refresh_tab(); } + + pub fn set_float_window(&mut self, float: Float) { + self.focus = Focus::FloatingWindow(float); + } } #[cfg(feature = "tips")]