Support specify csd-wrapper

This commit is contained in:
Kevin Yue
2024-02-03 13:12:17 +08:00
parent 13be9179f5
commit 662e4d0b8a
9 changed files with 101 additions and 31 deletions

View File

@@ -1,7 +1,8 @@
use anyhow::bail;
use std::{env, ffi::OsStr};
use std::ffi::OsStr;
use tokio::process::Command;
use uzers::{os::unix::UserExt, User};
use uzers::os::unix::UserExt;
use super::users::get_non_root_user;
pub trait CommandExt {
fn new_pkexec<S: AsRef<OsStr>>(program: S) -> Command;
@@ -34,29 +35,3 @@ impl CommandExt for Command {
Ok(self)
}
}
fn get_non_root_user() -> anyhow::Result<User> {
let current_user = whoami::username();
let user = if current_user == "root" {
get_real_user()?
} else {
uzers::get_user_by_name(&current_user).ok_or_else(|| anyhow::anyhow!("User ({}) not found", current_user))?
};
if user.uid() == 0 {
bail!("Non-root user not found")
}
Ok(user)
}
fn get_real_user() -> anyhow::Result<User> {
// Read the UID from SUDO_UID or PKEXEC_UID environment variable if available.
let uid = match env::var("SUDO_UID") {
Ok(uid) => uid.parse::<u32>()?,
_ => env::var("PKEXEC_UID")?.parse::<u32>()?,
};
uzers::get_user_by_uid(uid).ok_or_else(|| anyhow::anyhow!("User not found"))
}

View File

@@ -1,5 +1,6 @@
pub(crate) mod command_traits;
pub mod users;
pub mod auth_launcher;
#[cfg(feature = "browser-auth")]
pub mod browser_authenticator;

View File

@@ -0,0 +1,34 @@
use std::env;
use anyhow::bail;
use uzers::User;
pub fn get_user_by_name(username: &str) -> anyhow::Result<User> {
uzers::get_user_by_name(username).ok_or_else(|| anyhow::anyhow!("User ({}) not found", username))
}
pub fn get_non_root_user() -> anyhow::Result<User> {
let current_user = whoami::username();
let user = if current_user == "root" {
get_real_user()?
} else {
get_user_by_name(&current_user)?
};
if user.uid() == 0 {
bail!("Non-root user not found")
}
Ok(user)
}
fn get_real_user() -> anyhow::Result<User> {
// Read the UID from SUDO_UID or PKEXEC_UID environment variable if available.
let uid = match env::var("SUDO_UID") {
Ok(uid) => uid.parse::<u32>()?,
_ => env::var("PKEXEC_UID")?.parse::<u32>()?,
};
uzers::get_user_by_uid(uid).ok_or_else(|| anyhow::anyhow!("User not found"))
}