1*0648a547SJomo use core::sync::atomic::AtomicUsize; 2*0648a547SJomo 3*0648a547SJomo use alloc::vec::Vec; 4*0648a547SJomo 5*0648a547SJomo const GLOBAL_ROOT_UID: Kuid = Kuid(0); 6*0648a547SJomo const GLOBAL_ROOT_GID: Kgid = Kgid(0); 7*0648a547SJomo pub static INIT_CRED: Cred = Cred::init(); 8*0648a547SJomo 9*0648a547SJomo int_like!(Kuid, AtomicKuid, usize, AtomicUsize); 10*0648a547SJomo int_like!(Kgid, AtomicKgid, usize, AtomicUsize); 11*0648a547SJomo 12*0648a547SJomo bitflags! { 13*0648a547SJomo pub struct CAPFlags:u64{ 14*0648a547SJomo const CAP_EMPTY_SET = 0; 15*0648a547SJomo const CAP_FULL_SET = (1 << 41) - 1; 16*0648a547SJomo } 17*0648a547SJomo } 18*0648a547SJomo 19*0648a547SJomo pub enum CredFsCmp { 20*0648a547SJomo Equal, 21*0648a547SJomo Less, 22*0648a547SJomo Greater, 23*0648a547SJomo } 24*0648a547SJomo 25*0648a547SJomo /// 凭证集 26*0648a547SJomo #[derive(Debug, Clone, PartialEq, Eq)] 27*0648a547SJomo pub struct Cred { 28*0648a547SJomo /// 进程实际uid 29*0648a547SJomo pub uid: Kuid, 30*0648a547SJomo /// 进程实际gid 31*0648a547SJomo pub gid: Kgid, 32*0648a547SJomo /// 进程保存的uid 33*0648a547SJomo pub suid: Kuid, 34*0648a547SJomo /// 进程保存的gid 35*0648a547SJomo pub sgid: Kgid, 36*0648a547SJomo /// 进程有效的uid 37*0648a547SJomo pub euid: Kuid, 38*0648a547SJomo /// 进程有效的gid 39*0648a547SJomo pub egid: Kgid, 40*0648a547SJomo /// UID for VFS ops 41*0648a547SJomo pub fsuid: Kuid, 42*0648a547SJomo /// GID for VFS ops 43*0648a547SJomo pub fsgid: Kgid, 44*0648a547SJomo /// 子进程可以继承的权限 45*0648a547SJomo pub cap_inheritable: CAPFlags, 46*0648a547SJomo /// 当前进程被赋予的权限 47*0648a547SJomo pub cap_permitted: CAPFlags, 48*0648a547SJomo /// 当前进程实际使用的权限 49*0648a547SJomo pub cap_effective: CAPFlags, 50*0648a547SJomo /// capability bounding set 51*0648a547SJomo pub cap_bset: CAPFlags, 52*0648a547SJomo /// Ambient capability set 53*0648a547SJomo pub cap_ambient: CAPFlags, 54*0648a547SJomo /// supplementary groups for euid/fsgid 55*0648a547SJomo pub group_info: Option<GroupInfo>, 56*0648a547SJomo } 57*0648a547SJomo 58*0648a547SJomo impl Cred { init() -> Self59*0648a547SJomo pub const fn init() -> Self { 60*0648a547SJomo Self { 61*0648a547SJomo uid: GLOBAL_ROOT_UID, 62*0648a547SJomo gid: GLOBAL_ROOT_GID, 63*0648a547SJomo suid: GLOBAL_ROOT_UID, 64*0648a547SJomo sgid: GLOBAL_ROOT_GID, 65*0648a547SJomo euid: GLOBAL_ROOT_UID, 66*0648a547SJomo egid: GLOBAL_ROOT_GID, 67*0648a547SJomo fsuid: GLOBAL_ROOT_UID, 68*0648a547SJomo fsgid: GLOBAL_ROOT_GID, 69*0648a547SJomo cap_inheritable: CAPFlags::CAP_EMPTY_SET, 70*0648a547SJomo cap_permitted: CAPFlags::CAP_FULL_SET, 71*0648a547SJomo cap_effective: CAPFlags::CAP_FULL_SET, 72*0648a547SJomo cap_bset: CAPFlags::CAP_FULL_SET, 73*0648a547SJomo cap_ambient: CAPFlags::CAP_FULL_SET, 74*0648a547SJomo group_info: None, 75*0648a547SJomo } 76*0648a547SJomo } 77*0648a547SJomo 78*0648a547SJomo #[allow(dead_code)] 79*0648a547SJomo /// Compare two credentials with respect to filesystem access. fscmp(&self, other: Cred) -> CredFsCmp80*0648a547SJomo pub fn fscmp(&self, other: Cred) -> CredFsCmp { 81*0648a547SJomo if *self == other { 82*0648a547SJomo return CredFsCmp::Equal; 83*0648a547SJomo } 84*0648a547SJomo 85*0648a547SJomo if self.fsuid < other.fsuid { 86*0648a547SJomo return CredFsCmp::Less; 87*0648a547SJomo } 88*0648a547SJomo if self.fsuid > other.fsuid { 89*0648a547SJomo return CredFsCmp::Greater; 90*0648a547SJomo } 91*0648a547SJomo 92*0648a547SJomo if self.fsgid < other.fsgid { 93*0648a547SJomo return CredFsCmp::Less; 94*0648a547SJomo } 95*0648a547SJomo if self.fsgid > other.fsgid { 96*0648a547SJomo return CredFsCmp::Greater; 97*0648a547SJomo } 98*0648a547SJomo 99*0648a547SJomo if self.group_info == other.group_info { 100*0648a547SJomo return CredFsCmp::Equal; 101*0648a547SJomo } 102*0648a547SJomo 103*0648a547SJomo if let (Some(ga), Some(gb)) = (&self.group_info, &other.group_info) { 104*0648a547SJomo let ga_count = ga.gids.len(); 105*0648a547SJomo let gb_count = gb.gids.len(); 106*0648a547SJomo 107*0648a547SJomo if ga_count < gb_count { 108*0648a547SJomo return CredFsCmp::Less; 109*0648a547SJomo } 110*0648a547SJomo if ga_count > gb_count { 111*0648a547SJomo return CredFsCmp::Greater; 112*0648a547SJomo } 113*0648a547SJomo 114*0648a547SJomo for i in 0..ga_count { 115*0648a547SJomo if ga.gids[i] < gb.gids[i] { 116*0648a547SJomo return CredFsCmp::Less; 117*0648a547SJomo } 118*0648a547SJomo if ga.gids[i] > gb.gids[i] { 119*0648a547SJomo return CredFsCmp::Greater; 120*0648a547SJomo } 121*0648a547SJomo } 122*0648a547SJomo } else { 123*0648a547SJomo if self.group_info.is_none() { 124*0648a547SJomo return CredFsCmp::Less; 125*0648a547SJomo } 126*0648a547SJomo if other.group_info.is_none() { 127*0648a547SJomo return CredFsCmp::Greater; 128*0648a547SJomo } 129*0648a547SJomo } 130*0648a547SJomo 131*0648a547SJomo return CredFsCmp::Equal; 132*0648a547SJomo } 133*0648a547SJomo setuid(&mut self, uid: usize)134*0648a547SJomo pub fn setuid(&mut self, uid: usize) { 135*0648a547SJomo self.uid.0 = uid; 136*0648a547SJomo } 137*0648a547SJomo seteuid(&mut self, euid: usize)138*0648a547SJomo pub fn seteuid(&mut self, euid: usize) { 139*0648a547SJomo self.euid.0 = euid; 140*0648a547SJomo } 141*0648a547SJomo setsuid(&mut self, suid: usize)142*0648a547SJomo pub fn setsuid(&mut self, suid: usize) { 143*0648a547SJomo self.suid.0 = suid; 144*0648a547SJomo } 145*0648a547SJomo setfsuid(&mut self, fsuid: usize)146*0648a547SJomo pub fn setfsuid(&mut self, fsuid: usize) { 147*0648a547SJomo self.fsuid.0 = fsuid; 148*0648a547SJomo } 149*0648a547SJomo setgid(&mut self, gid: usize)150*0648a547SJomo pub fn setgid(&mut self, gid: usize) { 151*0648a547SJomo self.gid.0 = gid; 152*0648a547SJomo } 153*0648a547SJomo setegid(&mut self, egid: usize)154*0648a547SJomo pub fn setegid(&mut self, egid: usize) { 155*0648a547SJomo self.egid.0 = egid; 156*0648a547SJomo } 157*0648a547SJomo setsgid(&mut self, sgid: usize)158*0648a547SJomo pub fn setsgid(&mut self, sgid: usize) { 159*0648a547SJomo self.sgid.0 = sgid; 160*0648a547SJomo } 161*0648a547SJomo setfsgid(&mut self, fsgid: usize)162*0648a547SJomo pub fn setfsgid(&mut self, fsgid: usize) { 163*0648a547SJomo self.fsgid.0 = fsgid; 164*0648a547SJomo } 165*0648a547SJomo } 166*0648a547SJomo 167*0648a547SJomo #[derive(Debug, Clone, PartialEq, Eq)] 168*0648a547SJomo pub struct GroupInfo { 169*0648a547SJomo pub gids: Vec<Kgid>, 170*0648a547SJomo } 171