xref: /DragonOS/kernel/src/process/cred.rs (revision 0648a547da3461bd115f7566c6f2feca14eac6ff)
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