Refactor additionalGroups functionality (#2)
This commit is contained in:
parent
582a770e41
commit
c1fb7d3fe6
39
src/lldap.rs
39
src/lldap.rs
|
@ -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 =
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue
Block a user