From dca986f599e1abe4270a06efaf91759a926f2424 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Sun, 29 Jan 2023 17:23:14 +0000 Subject: Remove users dependency --- Cargo.toml | 1 - src/lib.rs | 9 ++++++--- src/passwd.rs | 11 +++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/passwd.rs diff --git a/Cargo.toml b/Cargo.toml index 0983fe5..9b5594d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,3 @@ crate-type = ["cdylib"] cap-std = "1.0.4" libc = "0.2.139" pam-bindings = "0.1.1" -users = "0.11.0" diff --git a/src/lib.rs b/src/lib.rs index e7b6edc..c104a23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,11 @@ // Copyright (C) 2023 Tomasz Kramkowski // SPDX-License-Identifier: MIT +mod passwd; + use cap_std::fs::{Dir, OpenOptions}; use pam::module::PamHandle; -use std::ffi::{c_char, c_int}; +use std::ffi::{c_char, c_int, CString}; use std::io::{ErrorKind, Write}; use std::panic; use std::path::Path; @@ -31,8 +33,9 @@ impl From for SessionError { fn open_session(h: &PamHandle, mountpoint: &str) -> Result<(), SessionError> { let user = h.get_user(None).or(Err(SessionError))?; - let user = users::get_user_by_name(&user).ok_or(SessionError)?; - let uid = user.uid().to_string(); + let user = CString::new(user).or(Err(SessionError))?; + let uid = passwd::get_uid_by_name(&user).ok_or(SessionError)?; + let uid = uid.to_string(); let d = Dir::open_ambient_dir(mountpoint, cap_std::ambient_authority())?; let d = create_and_open_dir(&d, "user")?; let d = create_and_open_dir(&d, &uid)?; diff --git a/src/passwd.rs b/src/passwd.rs new file mode 100644 index 0000000..40ec947 --- /dev/null +++ b/src/passwd.rs @@ -0,0 +1,11 @@ +use libc::uid_t; +use std::ffi::CStr; + +pub fn get_uid_by_name + ?Sized>(name: &S) -> Option { + let passwd = unsafe { libc::getpwnam(name.as_ref().as_ptr()) }; + if !passwd.is_null() { + Some(unsafe { *passwd }.pw_uid) + } else { + None + } +} -- cgit v1.2.3-54-g00ecf