shackle_shell/
user_info.rs

1use 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        // We can't get too specific here because this is your actual username,
30        // but we at lease expect it to be some string, not None.
31        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}