use std::io;
use std::string::ToString;
use serde::{Deserialize, Serialize};
use users::Group;
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub enum IncludeAdministrative {
Always,
RootOnly,
Users(Vec<String>),
Groups(Vec<String>),
Never,
}
impl IncludeAdministrative {
pub fn check_current_user(&self) -> io::Result<bool> {
Ok(match self {
IncludeAdministrative::Always => true,
IncludeAdministrative::RootOnly => users::get_current_uid() == 0,
IncludeAdministrative::Users(users) => users.contains(
&users::get_current_username()
.ok_or(io::Error::new(io::ErrorKind::NotFound, "could not get current user name"))?
.into_string()
.ok().ok_or(io::Error::new(io::ErrorKind::InvalidData, "usernam is not valid utf8"))?
),
IncludeAdministrative::Groups(groups) => {
for group in users::group_access_list()?
.iter()
.map(Group::name)
.filter_map(|g| g.to_str())
{
if groups.contains(&group.to_string()) {
return Ok(true)
}
}
false
}
IncludeAdministrative::Never => false,
})
}
}
impl Default for IncludeAdministrative {
fn default() -> Self {
IncludeAdministrative::Groups(vec![
"wheel".to_string(),
"sudo".to_string(),
])
}
}
#[cfg(test)]
mod tests {
use crate::config::IncludeAdministrative;
#[test]
fn test_default() {
let default = IncludeAdministrative::default().clone();
assert_eq!(
default,
IncludeAdministrative::Groups(vec![
"wheel".to_string(),
"sudo".to_string(),
])
)
}
}