From f2edfa448fd944061fe3c04920fc3f324ab847af Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Mon, 10 May 2021 23:02:55 +0200
Subject: [PATCH] [NSS] Implement stub of passwd endpoint retrieval

---
 src/nss.rs   | 22 +++++++++++++++++++---
 src/oauth.rs | 18 ++++++++++++++----
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/nss.rs b/src/nss.rs
index e866eb4..33fff7e 100644
--- a/src/nss.rs
+++ b/src/nss.rs
@@ -15,13 +15,18 @@
 
 use crate::config::{
     get_config,
-    get_optional
+    get_optional,
+    get_or_error
 };
 use config::Config;
 use crate::cache::get_cache;
 
 use crate::logging::setup_log;
 
+use crate::oauth::get_data;
+use std::collections::HashMap;
+use serde_json::value::Value;
+
 use libc::{getpwuid, geteuid};
 use std::ffi::CStr;
 
@@ -54,14 +59,25 @@ struct OidcPasswd;
 
 impl PasswdHooks for OidcPasswd {
     fn get_all_entries() -> Response<Vec<Passwd>> {
-        let config = nss_hook_prepare();
+        let conf = nss_hook_prepare();
+        let mut cache = get_cache();
 
         let user = get_current_user();
-        let token = match get_cache().load_user_token(&user) {
+        let token = match cache.load_user_token(&user) {
             Some(t) => t,
             None => return Response::Unavail
         };
 
+        let data: Vec<HashMap<String, Value>> = match get_data(conf, "nss", "passwd", token, "") {
+            Ok(d) => d,
+            Err(_) => return Response::Unavail
+        };
+        for ent in &data {
+            for (k, v) in ent {
+                debug!("{} {}", k, v);
+            }
+        }
+
         Response::Success(
             vec![
                 Passwd {
diff --git a/src/oauth.rs b/src/oauth.rs
index b0b9af2..58c8490 100644
--- a/src/oauth.rs
+++ b/src/oauth.rs
@@ -133,21 +133,31 @@ pub fn get_access_token_password<E: Copy>(conf: Config, prefix: &str, username:
         }
 }
 
-fn get_data<T: for<'de> Deserialize<'de>, E>(conf: Config, token: BasicTokenResponse, endpoint: String, error_value: E) -> Result<T, E> {
+pub fn get_data<T: for<'de> Deserialize<'de>, E: Copy>(conf: Config, prefix: &str, endpoint: &str, token: &BasicTokenResponse, error_value: E) -> Result<T, E> {
     let access_token = token.access_token().secret();
+    let endpoint_url: String = get_or_error(&conf, &full_key(prefix, &(endpoint.to_string() + "_url")), error_value)?;
 
+    info!("Loading JSON data from {}", endpoint_url);
     let client = reqwest::blocking::Client::new();
     let res = match client
-        .get(endpoint)
+        .get(&endpoint_url)
         .header(reqwest::header::AUTHORIZATION, format!("Bearer {}", access_token))
         .send() {
             Ok(r) => r,
-            Err(_) => return Err(error_value)
+            Err(e) => {
+                error!("Could not complete HTTP request: {}", e);
+                return Err(error_value);
+            }
         };
 
     let data = match res.json() {
         Ok(d) => d,
-        Err(_) => return Err(error_value)
+        Err(e) => {
+            error!("Could not parse JSON response: {}", e);
+            return Err(error_value);
+        }
     };
+
+    debug!("Successfully loaded JSON data from {}", endpoint_url);
     return Ok(data);
 }
-- 
GitLab