diff --git a/daemon/src/main.rs b/daemon/src/main.rs index b0e5a14..13bca8d 100644 --- a/daemon/src/main.rs +++ b/daemon/src/main.rs @@ -32,40 +32,39 @@ use std::{cell, env, fs, path, rc}; #[derive(Parser)] struct Args { - #[arg(long, value_name = "USER", help = "Allow USER to bind seat_v1")] - seat_user: Vec, + #[arg( + long, + value_name = "USER", + default_value = "root", + help = "Allow USER to bind seat_v1" + )] + seat_user: String, #[arg( long, value_name = "GROUP", + default_value = "root", help = "Allow members of GROUP to bind seat_v1" )] - seat_group: Vec, + seat_group: String, } struct SeatAccess { - users: Vec, - groups: Vec, + user: process::Uid, + group: process::Gid, } impl SeatAccess { - fn new(users: Vec, groups: Vec) -> Self { - if users.is_empty() && groups.is_empty() { - return Self { - users: vec![process::Uid::ROOT], - groups: vec![process::Gid::ROOT], - }; - } - - Self { users, groups } + fn new(user: process::Uid, group: process::Gid) -> Self { + Self { user, group } } fn allows(&self, creds: &net::UCred) -> bool { - if self.users.contains(&creds.uid) || self.groups.contains(&creds.gid) { + if self.user == creds.uid || self.group == creds.gid { return true; } self.process_groups(creds.pid.as_raw_pid() as u32) - .is_ok_and(|groups| groups.iter().any(|gid| self.groups.contains(gid))) + .is_ok_and(|groups| groups.contains(&self.group)) } fn process_groups(&self, pid: u32) -> anyhow::Result> { @@ -349,14 +348,8 @@ fn main() -> anyhow::Result<()> { log::info!("sessiond daemon starting"); let seat_access = SeatAccess::new( - args.seat_user - .iter() - .map(|user| resolve_user(user)) - .collect::>>()?, - args.seat_group - .iter() - .map(|group| resolve_group(group)) - .collect::>>()?, + resolve_user(&args.seat_user)?, + resolve_group(&args.seat_group)?, ); let mut event_loop = calloop::EventLoop::try_new()?; diff --git a/nix/nixos.nix b/nix/nixos.nix index 26a25f8..acd2675 100644 --- a/nix/nixos.nix +++ b/nix/nixos.nix @@ -17,6 +17,7 @@ in serviceConfig = { ExecStart = "${cfg.package}/bin/sessiond --seat-user ${cfg.seat.user} --seat-group ${cfg.seat.group}"; Environment = "LOG_LEVEL=info"; + Delegate = true; }; };