From 998e56d6482006aef5f6bf8e9c6896e5b2262f1a Mon Sep 17 00:00:00 2001 From: Doridian Date: Tue, 7 Jan 2025 17:09:31 -0800 Subject: [PATCH] begin reworking --- unix_integration/resolver/src/db.rs | 31 +++++++++++++++++++++++ unix_integration/resolver/src/resolver.rs | 25 +++++++++++++----- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/unix_integration/resolver/src/db.rs b/unix_integration/resolver/src/db.rs index 094562f97..3070ac57a 100644 --- a/unix_integration/resolver/src/db.rs +++ b/unix_integration/resolver/src/db.rs @@ -792,6 +792,37 @@ impl DbTxn<'_> { } } + pub fn get_user_groups(&mut self, a_uuid: Uuid) -> Result, CacheError> { + let mut stmt = self + .conn + .prepare("SELECT group_t.token FROM (group_t, memberof_t) WHERE group_t.uuid = memberof_t.g_uuid AND memberof_t.a_uuid = :a_uuid") + .map_err(|e| { + self.sqlite_error("select prepare", &e) + })?; + + let data_iter = stmt + .query_map([a_uuid.as_hyphenated().to_string()], |row| row.get(0)) + .map_err(|e| self.sqlite_error("query_map", &e))?; + let data: Result>, _> = data_iter + .map(|v| v.map_err(|e| self.sqlite_error("map", &e))) + .collect(); + + let data = data?; + + Ok(data + .iter() + .filter_map(|token| { + // token convert with json. + // trace!("{:?}", token); + serde_json::from_slice(token.as_slice()) + .map_err(|e| { + error!("json error -> {:?}", e); + }) + .ok() + }) + .collect()) + } + pub fn get_group_members(&mut self, g_uuid: Uuid) -> Result, CacheError> { let mut stmt = self .conn diff --git a/unix_integration/resolver/src/resolver.rs b/unix_integration/resolver/src/resolver.rs index c16b9c942..12f55ed1f 100644 --- a/unix_integration/resolver/src/resolver.rs +++ b/unix_integration/resolver/src/resolver.rs @@ -576,6 +576,17 @@ impl Resolver { }) } + async fn get_usergroups(&self, g_uuid: Uuid) -> Vec { + let mut dbtxn = self.db.write().await; + + dbtxn + .get_user_groups(g_uuid) + .unwrap_or_else(|_| Vec::new()) + .into_iter() + .map(|gt| self.token_gidattr(>)) + .collect() + } + async fn get_groupmembers(&self, g_uuid: Uuid) -> Vec { let mut dbtxn = self.db.write().await; @@ -737,12 +748,14 @@ impl Resolver { } pub async fn get_nssgroups_member_name(&self, account_id: &str) -> Result, ()> { - let account_name = account_id.to_string(); - Ok(self.get_nssgroups().await. - unwrap_or_else(|_| Vec::new()) - .into_iter() - .filter(|g| g.members.contains(&account_name)) - .collect()) + if let Some(nss_user) = self.get_nssaccount(&account_id).await { + Ok(self.get_usergroups(nss_user).await + .into_iter() + .map(|g| self.token_gidattr(&g)) + .collect()) + } else { + Ok(Vec::new()) + } } async fn get_nssgroup(&self, grp_id: Id) -> Result, ()> {