Refactor additionalGroups functionality (#2)

This commit is contained in:
Dreaded_X 2025-03-19 03:24:59 +01:00
parent 582a770e41
commit c1fb7d3fe6
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
2 changed files with 41 additions and 36 deletions

View File

@ -4,7 +4,7 @@ use lldap_auth::registration::ServerRegistrationStartResponse;
use lldap_auth::{opaque, registration};
use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION};
use std::time::Duration;
use tracing::debug;
use tracing::{debug, trace};
use cynic::http::{CynicReqwestError, ReqwestExt};
use cynic::{GraphQlError, GraphQlResponse, MutationBuilder, QueryBuilder};
@ -179,6 +179,43 @@ impl LldapClient {
Ok(())
}
pub async fn update_user_groups(&self, user: &User, needed_groups: &[String]) -> Result<()> {
let all_groups = self.get_groups().await?;
// TODO: Error when invalid name
let needed_groups: Vec<_> = needed_groups
.iter()
.filter_map(|needed_group| {
all_groups
.iter()
.find(|group| &group.display_name == needed_group)
.map(|group| group.id)
})
.collect();
let current_groups: Vec<_> = user.groups.iter().map(|group| group.id).collect();
let remove = current_groups
.iter()
.filter(|group| !needed_groups.contains(group));
for &group in remove {
trace!(username = user.id, group, "Removing user from group");
self.remove_user_from_group(&user.id, group).await?;
}
let add = needed_groups
.iter()
.filter(|group| !current_groups.contains(group));
for &group in add {
trace!(username = user.id, group, "Adding user to group");
self.add_user_to_group(&user.id, group).await?;
}
Ok(())
}
pub async fn update_password(&self, username: &str, password: &str) -> Result<()> {
let mut rng = rand::rngs::OsRng;
let registration_start_request =

View File

@ -218,41 +218,9 @@ impl Reconcile for ServiceUser {
Err(err) => Err(err),
}?;
let groups = lldap_client.get_groups().await?;
// TODO: Error when invalid name
let needed_groups: Vec<_> = self
.spec
.additional_groups
.iter()
.filter_map(|additional_group| {
groups
.iter()
.find(|group| &group.display_name == additional_group)
.map(|group| group.id)
})
.collect();
let current_groups: Vec<_> = user.groups.iter().map(|group| group.id).collect();
let remove = current_groups
.iter()
.filter(|group| !needed_groups.contains(group));
for &group in remove {
trace!(name, username, group, "Removing user from group");
lldap_client
.remove_user_from_group(&username, group)
.await?;
}
let add = needed_groups
.iter()
.filter(|group| !current_groups.contains(group));
for &group in add {
trace!(name, username, group, "Adding user to group");
lldap_client.add_user_to_group(&username, group).await?;
}
trace!(name, "Updating groups");
let groups = self.spec.additional_groups.clone();
lldap_client.update_user_groups(&user, &groups).await?;
trace!(name, "Updating password");
let password = secret.get().data.as_ref().unwrap().get("password").unwrap();