use crate::error::Result;
use serde::{Deserialize, Serialize};
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdapMapping {
pub uid: u32,
pub name: String,
pub dn: String,
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role_uids: Option<Vec<u32>>,
}
#[derive(Debug, Serialize, Deserialize, TypedBuilder)]
pub struct CreateLdapMappingRequest {
#[builder(setter(into))]
pub name: String,
#[builder(setter(into))]
pub dn: String,
#[builder(setter(into))]
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub role_uids: Option<Vec<u32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdapConfig {
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub servers: Option<Vec<LdapServer>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_refresh_interval: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authentication_query_suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_query_suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bind_dn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bind_pass: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdapServer {
pub host: String,
pub port: u16,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_tls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starttls: Option<bool>,
}
define_handler!(
pub struct LdapMappingHandler;
);
impl_crud!(LdapMappingHandler {
list => LdapMapping, "/v1/ldap_mappings";
get(u32) => LdapMapping, "/v1/ldap_mappings/{}";
delete(u32), "/v1/ldap_mappings/{}";
create(CreateLdapMappingRequest) => LdapMapping, "/v1/ldap_mappings";
update(u32, CreateLdapMappingRequest) => LdapMapping, "/v1/ldap_mappings/{}";
});
impl LdapMappingHandler {
pub async fn get_config(&self) -> Result<LdapConfig> {
self.client.get("/v1/cluster/ldap").await
}
pub async fn update_config(&self, config: LdapConfig) -> Result<LdapConfig> {
self.client.put("/v1/cluster/ldap", &config).await
}
}