shackle_shell/
user_info.rs1use nix::unistd::{getgroups, getuid, Gid, Group, User};
2
3pub fn get_username() -> Option<String> {
4 let uid = getuid();
5 User::from_uid(uid).ok().flatten().map(|user| user.name)
6}
7
8pub fn get_user_groups() -> Vec<String> {
9 let gids = getgroups().unwrap_or_default();
10 gids.into_iter()
11 .filter_map(|gid| Group::from_gid(gid).ok().flatten())
12 .map(|group| group.name)
13 .collect()
14}
15
16pub fn get_gid(group_name: &str) -> Option<Gid> {
17 nix::unistd::Group::from_name(group_name)
18 .ok()
19 .flatten()
20 .map(|group| group.gid)
21}
22
23#[cfg(test)]
24mod test {
25 use super::*;
26
27 #[test]
28 fn it_returns_a_username() {
29 let username = get_username();
32 let username_len = username.unwrap().trim().len();
33 assert!(username_len > 0);
34 }
35
36 #[test]
37 fn it_returns_some_groups() {
38 let groups = get_user_groups();
39 assert!(groups.len() > 0);
40 for group in groups {
41 assert!(group.trim().len() > 0);
42 }
43 }
44}