slight refactor

This commit is contained in:
tylermurphy534 2022-11-10 11:28:10 -05:00
parent 3c1fd3acfe
commit f7a13253e7
4 changed files with 34 additions and 40 deletions

View file

@ -1,10 +0,0 @@
pub fn help() {
let help =
"Usage:
crab [-d] command [args]
Options:
-v --version Get the current version of the package
-h --help Generates the crab help message
-d If your user is set to persist, dont save persistance";
println!("{}", help);
}

View file

@ -14,7 +14,6 @@ const ERROR_RUN_ROOT: u8 = 6;
mod persist; mod persist;
mod flags; mod flags;
mod help;
mod secure; mod secure;
fn main() -> ExitCode { fn main() -> ExitCode {
@ -22,7 +21,7 @@ fn main() -> ExitCode {
let flags = match flags::parse(&args[1..]) { let flags = match flags::parse(&args[1..]) {
Some(data) => data, Some(data) => data,
None => { None => {
help::help(); help();
return ExitCode::from(ERROR_ARGS); return ExitCode::from(ERROR_ARGS);
} }
}; };
@ -31,7 +30,7 @@ fn main() -> ExitCode {
return ExitCode::SUCCESS; return ExitCode::SUCCESS;
} }
if flags.help { if flags.help {
help::help(); help();
return ExitCode::SUCCESS; return ExitCode::SUCCESS;
} }
if args.len() - flags.arg_count < 2 { if args.len() - flags.arg_count < 2 {
@ -74,6 +73,17 @@ fn main() -> ExitCode {
ExitCode::SUCCESS ExitCode::SUCCESS
} }
fn help() {
let help =
"Usage:
crab [-d] command [args]
Options:
-v --version Get the current version of the package
-h --help Generates the crab help message
-d If your user is set to persist, dont save persistance";
println!("{}", help);
}
struct Config { struct Config {
users: Vec<(String, bool)> users: Vec<(String, bool)>
} }

View file

@ -21,7 +21,7 @@ pub fn get_persist(user: &str) -> bool {
pub fn set_persist(user: &str) { pub fn set_persist(user: &str) {
let mut json = match get_terminal_config() { let mut json = match get_terminal_config() {
Some(data) => data, Some(data) => data,
None => return None => serde_json::from_str("{}").unwrap()
}; };
json[user] = Value::from(now()); json[user] = Value::from(now());
let id = match get_terminal_process() { let id = match get_terminal_process() {
@ -30,22 +30,22 @@ pub fn set_persist(user: &str) {
}; };
match secure::write_file(PERSIST_PATH, &format!("{}", id), &json.to_string()) { match secure::write_file(PERSIST_PATH, &format!("{}", id), &json.to_string()) {
Ok(_) => {}, Ok(_) => {},
Err(e) => { Err(_) => {
eprintln!("Internal Error: {}", e) eprintln!("crab: An Internal Has Error")
} }
}; };
} }
fn get_terminal_process() -> Option<i32> { fn get_terminal_process() -> Option<i32> {
let id: i32 = match std::process::id().try_into() { let pid: i32 = match std::process::id().try_into() {
Ok(data) => data, Ok(data) => data,
Err(_) => return None Err(_) => return None
}; };
let stat = match procinfo::pid::stat(id) { let pid_stat = match procinfo::pid::stat(pid) {
Ok(data) => data, Ok(data) => data,
Err(_) => return None Err(_) => return None
}; };
Some(stat.session) Some(pid_stat.session)
} }
fn get_terminal_config() -> Option<Value> { fn get_terminal_config() -> Option<Value> {

View file

@ -1,46 +1,40 @@
use std::{os::{unix::prelude::PermissionsExt, linux::fs::MetadataExt}, fs, io::ErrorKind}; use std::{os::{unix::prelude::PermissionsExt, linux::fs::MetadataExt}, fs, io};
use nix::unistd; use nix::unistd;
pub fn write_file(dir: &str, file: &str, data: &str) -> Result<(), Box<dyn std::error::Error>> { pub fn write_file(dir: &str, file: &str, data: &str) -> Result<(), io::Error> {
std::fs::create_dir_all(dir)?; fs::create_dir_all(dir)?;
make_file_root(dir)?; set_file_permissions(0, 0, 0o100600, dir)?;
let path = path(dir, file); let path = path(dir, file);
std::fs::write(&path, "")?; fs::write(&path, "")?;
make_file_root(&path)?; set_file_permissions(0, 0, 0o100600, &path)?;
std::fs::write(&path, data)?; fs::write(&path, data)?;
Ok(()) Ok(())
} }
pub fn read_file(dir: &str, file: &str) -> Option<String> { pub fn read_file(dir: &str, file: &str) -> Option<String> {
let path = path(dir,file); let path = path(dir,file);
if !is_file_root(&path) { if !check_file_permissions(0, 0, 0o100600, &path) {
return None; return None;
} }
match std::fs::read_to_string(&path) { match fs::read_to_string(&path) {
Ok(data) => return Some(data), Ok(data) => return Some(data),
Err(_) => return None Err(_) => return None
}; };
} }
fn make_file_root(path: &str) -> Result<(), Box<dyn std::error::Error>> { fn set_file_permissions(uid: u32, gid: u32, mode: u32, path: &str) -> Result<(), io::Error> {
unistd::chown(std::path::Path::new(path), Some(unistd::Uid::from(0)), Some(unistd::Gid::from(0)))?; unistd::chown(std::path::Path::new(path), Some(unistd::Uid::from(uid)), Some(unistd::Gid::from(gid)))?;
let metadata = std::fs::metadata(path)?; let metadata = fs::metadata(path)?;
let mut perms = metadata.permissions(); let mut perms = metadata.permissions();
perms.set_mode(0o100600); perms.set_mode(mode);
fs::set_permissions(path, perms)?; fs::set_permissions(path, perms)?;
Ok(()) Ok(())
} }
fn is_file_root(path: &str) -> bool {
return check_file_permissions(0, 0, 0o100600, path);
}
fn check_file_permissions(uid: u32, gid: u32, mode: u32, path: &str) -> bool { fn check_file_permissions(uid: u32, gid: u32, mode: u32, path: &str) -> bool {
let metadata = match std::fs::metadata(path) { let metadata = match fs::metadata(path) {
Ok(data) => data, Ok(data) => data,
Err(e) => { Err(_) => return false
return e.kind() == ErrorKind::NotFound
}
}; };
let perms = metadata.permissions(); let perms = metadata.permissions();
return perms.mode() == mode && metadata.st_uid() == uid && metadata.st_gid() == gid; return perms.mode() == mode && metadata.st_uid() == uid && metadata.st_gid() == gid;