src/config/cached_user_info.rs: new helper class
This commit is contained in:
		@ -19,6 +19,7 @@ pub mod datastore;
 | 
				
			|||||||
pub mod remote;
 | 
					pub mod remote;
 | 
				
			||||||
pub mod user;
 | 
					pub mod user;
 | 
				
			||||||
pub mod acl;
 | 
					pub mod acl;
 | 
				
			||||||
 | 
					pub mod cached_user_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Check configuration directory permissions
 | 
					/// Check configuration directory permissions
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ pub const ROLE_DATASTORE_AUDIT: u64 = PRIV_DATASTORE_AUDIT;
 | 
				
			|||||||
pub const ROLE_NAME_NO_ACCESS: &str ="NoAccess";
 | 
					pub const ROLE_NAME_NO_ACCESS: &str ="NoAccess";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lazy_static! {
 | 
					lazy_static! {
 | 
				
			||||||
    static ref ROLE_NAMES: HashMap<&'static str, u64> = {
 | 
					    pub static ref ROLE_NAMES: HashMap<&'static str, u64> = {
 | 
				
			||||||
        let mut map = HashMap::new();
 | 
					        let mut map = HashMap::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        map.insert("Admin", ROLE_ADMIN);
 | 
					        map.insert("Admin", ROLE_ADMIN);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										69
									
								
								src/config/cached_user_info.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/config/cached_user_info.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					//! Cached user info for fast ACL permission checks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use std::sync::Arc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use failure::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use proxmox::api::section_config::SectionConfigData;
 | 
				
			||||||
 | 
					use proxmox::api::UserInformation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use super::acl::{AclTree, ROLE_NAMES};
 | 
				
			||||||
 | 
					use super::user::User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Cache User/Group/Acl configuration data for fast permission tests
 | 
				
			||||||
 | 
					pub struct CachedUserInfo {
 | 
				
			||||||
 | 
					    user_cfg: Arc<SectionConfigData>,
 | 
				
			||||||
 | 
					    acl_tree: Arc<AclTree>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl CachedUserInfo {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Creates a new instance.
 | 
				
			||||||
 | 
					    pub fn new() -> Result<Self, Error> {
 | 
				
			||||||
 | 
					        Ok(CachedUserInfo {
 | 
				
			||||||
 | 
					            user_cfg: super::user::cached_config()?,
 | 
				
			||||||
 | 
					            acl_tree: super::acl::cached_config()?,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Test if a user account is enabled and not expired
 | 
				
			||||||
 | 
					    pub fn is_active_user(&self, userid: &str) -> bool {
 | 
				
			||||||
 | 
					        if let Ok(info) = self.user_cfg.lookup::<User>("user", &userid) {
 | 
				
			||||||
 | 
					            if !info.enable.unwrap_or(true) {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if let Some(expire) = info.expire {
 | 
				
			||||||
 | 
					                if expire > 0 {
 | 
				
			||||||
 | 
					                    let now = unsafe { libc::time(std::ptr::null_mut()) };
 | 
				
			||||||
 | 
					                    if expire <= now {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl UserInformation for CachedUserInfo {
 | 
				
			||||||
 | 
					    fn is_superuser(&self, userid: &str) -> bool {
 | 
				
			||||||
 | 
					        userid == "root@pam"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn is_group_member(&self, _userid: &str, _group: &str) -> bool {
 | 
				
			||||||
 | 
					        false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn lookup_privs(&self, userid: &str, path: &[&str]) -> u64 {
 | 
				
			||||||
 | 
					        let roles = self.acl_tree.roles(userid, path);
 | 
				
			||||||
 | 
					        let mut privs: u64 = 0;
 | 
				
			||||||
 | 
					        for role in roles {
 | 
				
			||||||
 | 
					            if let Some(role_privs) = ROLE_NAMES.get(role.as_str()) {
 | 
				
			||||||
 | 
					                privs |= role_privs;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        privs
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user