From 52715922d9e7ae4cc0b6b5ef2055a52bfd8fd5ba Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Thu, 6 May 2021 16:19:17 +0200 Subject: [PATCH] [NSS] Add module stub --- Cargo.toml | 4 +++ src/lib.rs | 12 ++++++-- src/nss.rs | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/nss.rs diff --git a/Cargo.toml b/Cargo.toml index 03ce093..288fb6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,10 @@ crate-type = [ "cdylib" ] [dependencies] pamsm = { version = "^0.4.2", features = ["libpam"] } +libnss = "^0.1.0" +paste = "^0.1" +libc = "^0.2.0" +lazy_static = "^1.3.0" oauth2 = "^4.0.0" reqwest = "^0.11.3" config = "^0.11.0" diff --git a/src/lib.rs b/src/lib.rs index 4932966..20d7cfe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,15 @@ -#[macro_use] extern crate pamsm; +// Modules and macro imports for our own code #[macro_use] extern crate log; - mod cache; mod logging; mod config; + +// Module and macro imports for the PAM component +#[macro_use] extern crate pamsm; mod pam; + +// Module and macro imports for the NSS component +extern crate libc; +#[macro_use] extern crate lazy_static; +#[macro_use] extern crate libnss; +mod nss; diff --git a/src/nss.rs b/src/nss.rs new file mode 100644 index 0000000..38fe9a7 --- /dev/null +++ b/src/nss.rs @@ -0,0 +1,85 @@ +/* Copyright 2021 Dominik George <dominik.george@teckids.org> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use crate::config::get_config; +use config::Config; + +use crate::logging::setup_log; + +use libnss::passwd::{PasswdHooks, Passwd}; + +fn nss_hook_prepare() -> Config { + let conf = get_config(None); + + let mut log_level = log::LevelFilter::Error; + if conf.get_bool("debug").unwrap_or_default() || conf.get_bool("nss.debug").unwrap_or_default() { + log_level = log::LevelFilter::Debug; + } + setup_log(log_level); + + return conf; +} + +struct OidcPasswd; + +impl PasswdHooks for OidcPasswd { + fn get_all_entries() -> Vec<Passwd> { + vec![ + Passwd { + name: "test".to_string(), + passwd: "x".to_string(), + uid: 1005, + gid: 1005, + gecos: "Test Account".to_string(), + dir: "/home/test".to_string(), + shell: "/bin/bash".to_string(), + } + ] + } + + fn get_entry_by_uid(uid: libc::uid_t) -> Option<Passwd> { + if uid == 1005 { + return Some(Passwd { + name: "test".to_string(), + passwd: "x".to_string(), + uid: 1005, + gid: 1005, + gecos: "Test Account".to_string(), + dir: "/home/test".to_string(), + shell: "/bin/bash".to_string(), + }); + } + + None + } + + fn get_entry_by_name(name: String) -> Option<Passwd> { + if name == "test" { + return Some(Passwd { + name: "test".to_string(), + passwd: "x".to_string(), + uid: 1005, + gid: 1005, + gecos: "Test Account".to_string(), + dir: "/home/test".to_string(), + shell: "/bin/bash".to_string(), + }); + } + + None + } +} + +libnss_passwd_hooks!(oidc, OidcPasswd); -- GitLab