diff --git a/Cargo.lock b/Cargo.lock index 605cd30e..cb6f2784 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" @@ -436,6 +442,7 @@ dependencies = [ "anstyle", "clap", "linutil_core", + "nix 0.29.0", "oneshot", "portable-pty", "rand", @@ -528,6 +535,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" @@ -598,7 +617,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix", + "nix 0.25.1", "serial", "shared_library", "shell-words", diff --git a/tui/Cargo.toml b/tui/Cargo.toml index a486e1e4..d8036618 100644 --- a/tui/Cargo.toml +++ b/tui/Cargo.toml @@ -29,6 +29,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..5ff4c3f8 --- /dev/null +++ b/tui/src/root.rs @@ -0,0 +1,45 @@ +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\nThis means you have full system access and commands can potentially damage your system if used incorrectly.\n\nPlease proceed with caution and make sure you understand what each command 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")]