use std::os::unix::io::AsRawFd;
#[allow(clippy::borrow_as_ptr)] pub fn authenticate_peer(stream: &tokio::net::UnixStream) -> Result<(), String> {
let fd = stream.as_raw_fd();
let mut ucred: libc::ucred = unsafe { std::mem::zeroed() };
#[allow(clippy::cast_possible_truncation)] let mut len = std::mem::size_of::<libc::ucred>() as libc::socklen_t;
let ret = unsafe {
libc::getsockopt(
fd,
libc::SOL_SOCKET,
libc::SO_PEERCRED,
std::ptr::addr_of_mut!(ucred).cast::<libc::c_void>(),
&mut len,
)
};
if ret != 0 {
return Err(format!(
"getsockopt(SO_PEERCRED) failed: {}",
std::io::Error::last_os_error()
));
}
let daemon_uid = unsafe { libc::getuid() };
if ucred.uid != daemon_uid {
return Err(format!(
"UID mismatch: peer={}, daemon={}",
ucred.uid, daemon_uid
));
}
Ok(())
}