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