refactor: Reuse typed LDAP attributes in search results
This commit is contained in:
parent
586faccc7c
commit
e32b4bfb82
1 changed files with 35 additions and 23 deletions
|
|
@ -148,30 +148,42 @@ pub async fn search_success(
|
||||||
|
|
||||||
fn search_entry_from_user(user: &User, req_attrs: &[String]) -> LdapSearchResultEntry {
|
fn search_entry_from_user(user: &User, req_attrs: &[String]) -> LdapSearchResultEntry {
|
||||||
let mut res: Vec<LdapPartialAttribute> = vec![];
|
let mut res: Vec<LdapPartialAttribute> = vec![];
|
||||||
for attr in req_attrs {
|
for attr_str in req_attrs {
|
||||||
if let Some(attr_values) = match attr.as_str() {
|
// We keep a copy of the requested attribute so that we can answer as it was requested,
|
||||||
"uid" => Some(vec![user.username.clone()]),
|
// eg. `CN` => `CN` (instead of normalizing to `cn`).
|
||||||
"cn" | "mail" => Some(vec![user.mail.clone()]),
|
let Some(attr) = LdapAttribute::from_str(attr_str)
|
||||||
// TODO: group membership
|
.inspect_err(|e| tracing::debug!("Unknown attribute in request: {e}"))
|
||||||
"memberof" => Some(vec![]),
|
.ok()
|
||||||
// Copied from lldap output, not sure if we want to add/remove some classes depending on context
|
else {
|
||||||
"objectclass" => Some(
|
continue;
|
||||||
vec!["inetOrgPerson", "posixAccount", "mailAccount", "person"]
|
};
|
||||||
.into_iter()
|
|
||||||
.map(String::from)
|
let str_values = match attr {
|
||||||
.collect(),
|
// TODO: should we normalize the value some more here?
|
||||||
),
|
LdapAttribute::Uid => vec![user.username.clone()],
|
||||||
_ => {
|
// TODO: should CN be different than the mail?
|
||||||
tracing::warn!("Ignoring unknown attr in search query: {attr}");
|
// TODO: should we normalize values some more here?
|
||||||
None
|
LdapAttribute::CommonName | LdapAttribute::Mail | LdapAttribute::MailAlias => {
|
||||||
|
vec![user.mail.clone()]
|
||||||
}
|
}
|
||||||
} {
|
// TODO: group membership
|
||||||
res.push(LdapPartialAttribute {
|
LdapAttribute::MemberOf => vec![],
|
||||||
atype: attr.clone(),
|
// TODO: if we introduce mail permission, we need to remove mailaccount from here
|
||||||
// LDAP response expects raw byte vec for each value
|
LdapAttribute::ObjectClass => vec![
|
||||||
vals: attr_values.into_iter().map(Vec::from).collect(),
|
"inetOrgPerson".to_string(),
|
||||||
});
|
"posixAccount".to_string(),
|
||||||
}
|
"mailAccount".to_string(),
|
||||||
|
"person".to_string(),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
res.push(LdapPartialAttribute {
|
||||||
|
// Reuse the requested attribute name, not the normalized form
|
||||||
|
// we would otherwise produce.
|
||||||
|
atype: attr_str.clone(),
|
||||||
|
// LDAP response expects raw byte vec for each value
|
||||||
|
vals: str_values.into_iter().map(Vec::from).collect(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
LdapSearchResultEntry {
|
LdapSearchResultEntry {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue