make delete_user take a struct use derive_builder
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
pub mod newuser_args;
|
||||
|
||||
pub use newuser_args::{DeleteHome, DeletePrimaryGroup, NewUserArgs};
|
||||
pub trait UserDBRead {
|
||||
fn get_all_users(&self) -> Vec<&crate::User>;
|
||||
fn get_user_by_name(&self, name: &str) -> Option<&crate::User>;
|
||||
@@ -15,7 +18,10 @@ pub trait UserDBValidation {
|
||||
}
|
||||
|
||||
pub trait UserDBWrite {
|
||||
fn delete_user(&mut self, user: &str) -> Result<crate::User, crate::UserLibError>;
|
||||
fn delete_user(
|
||||
&mut self,
|
||||
params: newuser_args::NewUserArgs,
|
||||
) -> Result<crate::User, crate::UserLibError>;
|
||||
fn new_user(
|
||||
&mut self, /*
|
||||
username: String,
|
||||
@@ -0,0 +1,38 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum DeleteHome {
|
||||
Delete,
|
||||
Keep,
|
||||
Archive { path: PathBuf },
|
||||
}
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum DeletePrimaryGroup {
|
||||
Delete,
|
||||
Keep,
|
||||
DeleteIfEmpty,
|
||||
}
|
||||
|
||||
#[derive(Debug, Builder)]
|
||||
#[builder(public)]
|
||||
pub struct NewUserArgs<'a> {
|
||||
pub username: &'a str,
|
||||
pub delete_home: DeleteHome,
|
||||
pub delete_primary_group: DeletePrimaryGroup,
|
||||
}
|
||||
|
||||
impl<'a> NewUserArgs<'a> {
|
||||
pub fn builder() -> NewUserArgsBuilder<'a> {
|
||||
NewUserArgsBuilder::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for NewUserArgs<'_> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
username: "defaultuser",
|
||||
delete_home: DeleteHome::Keep,
|
||||
delete_primary_group: DeletePrimaryGroup::DeleteIfEmpty,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,12 @@ fn main() {
|
||||
|
||||
let mut db = adduser::UserDBLocal::load_files(mf).unwrap();
|
||||
|
||||
let user_res: Result<adduser::User, adduser::UserLibError> = db.delete_user("teste");
|
||||
let user_res: Result<adduser::User, adduser::UserLibError> = db.delete_user(
|
||||
adduser::api::NewUserArgs::builder()
|
||||
.username("teste")
|
||||
.build()
|
||||
.unwrap(),
|
||||
);
|
||||
match user_res {
|
||||
Ok(u) => info!(
|
||||
"The user <{}> has been deleted! ",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
#[macro_use]
|
||||
extern crate derive_builder;
|
||||
|
||||
extern crate log;
|
||||
|
||||
|
||||
+12
-7
@@ -144,9 +144,9 @@ impl UserDBLocal {
|
||||
|
||||
use crate::api::UserDBWrite;
|
||||
impl UserDBWrite for UserDBLocal {
|
||||
fn delete_user(&mut self, username: &str) -> Result<crate::User, UserLibError> {
|
||||
fn delete_user(&mut self, args: crate::api::NewUserArgs) -> Result<crate::User, UserLibError> {
|
||||
// try to get the user from the database
|
||||
let user_opt = self.get_user_by_name(username);
|
||||
let user_opt = self.get_user_by_name(args.username);
|
||||
let user = match user_opt {
|
||||
Some(user) => user,
|
||||
None => {
|
||||
@@ -156,7 +156,7 @@ impl UserDBWrite for UserDBLocal {
|
||||
|
||||
if self.source_files.is_virtual() {
|
||||
warn!("There are no associated files working in dummy mode!");
|
||||
let res = self.users.remove(username);
|
||||
let res = self.users.remove(args.username);
|
||||
match res {
|
||||
Some(u) => Ok(u),
|
||||
None => Err(UserLibError::NotFound), // should not happen anymore as existence is checked.
|
||||
@@ -175,7 +175,7 @@ impl UserDBWrite for UserDBLocal {
|
||||
| src.shadow.has_changed(&shadow_file_content)
|
||||
{
|
||||
error!("The source files have changed. Deleting the user could corrupt the userdatabase. Aborting!");
|
||||
Err(format!("The userdatabase has been changed {}", username).into())
|
||||
Err(format!("The userdatabase has been changed {}", args.username).into())
|
||||
} else {
|
||||
UserDBLocal::delete_from_passwd(user, passwd_file_content, &mut locked_p)?;
|
||||
UserDBLocal::delete_from_shadow(user, shadow_file_content, &mut locked_s)?;
|
||||
@@ -207,7 +207,7 @@ impl UserDBWrite for UserDBLocal {
|
||||
),
|
||||
}
|
||||
// Remove the user from the memory database(HashMap)
|
||||
let res = self.users.remove(username);
|
||||
let res = self.users.remove(args.username);
|
||||
match res {
|
||||
Some(u) => Ok(u),
|
||||
None => Err("Failed to remove the user from the internal HashMap".into()),
|
||||
@@ -463,11 +463,16 @@ fn test_user_db_read_implementation() {
|
||||
|
||||
#[test]
|
||||
fn test_user_db_write_implementation() {
|
||||
use crate::api::NewUserArgs;
|
||||
let mut data = UserDBLocal::import_from_strings("test:x:1001:1001:full Name,004,000342,001-2312,myemail@test.com:/home/test:/bin/test", "test:!!$6$/RotIe4VZzzAun4W$7YUONvru1rDnllN5TvrnOMsWUD5wSDUPAD6t6/Xwsr/0QOuWF3HcfAhypRkGa8G1B9qqWV5kZSnCb8GKMN9N61:18260:0:99999:7:::", "teste:x:1002:test,test");
|
||||
let user = "test";
|
||||
|
||||
assert_eq!(data.get_all_users().len(), 1);
|
||||
assert!(data.delete_user(&user).is_ok());
|
||||
assert!(data.delete_user(&user).is_err());
|
||||
assert!(data
|
||||
.delete_user(NewUserArgs::builder().username(&user).build().unwrap())
|
||||
.is_ok());
|
||||
assert!(data
|
||||
.delete_user(NewUserArgs::builder().username(&user).build().unwrap())
|
||||
.is_err());
|
||||
assert_eq!(data.get_all_users().len(), 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user