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