use ldap3::SearchEntry;
use std::collections::HashMap;
pub enum Type {
User,
Computer,
Group,
Ou,
Domain,
Gpo,
ForeignSecurityPrincipal,
Container,
Trust,
AdcsAuthority,
AdcsTemplate,
Unknown
}
pub fn get_type(result: SearchEntry) -> std::result::Result<Type, Type>
{
let result_attrs: HashMap<String, Vec<String>>;
result_attrs = result.attrs;
for (key, value) in &result_attrs
{
if key == "objectClass" && value.contains(&String::from("person")) && value.contains(&String::from("user")) && !value.contains(&String::from("computer")) && !value.contains(&String::from("group"))
{
return Ok(Type::User)
}
if key == "objectClass" && value.contains(&String::from("msDS-GroupManagedServiceAccount"))
{
return Ok(Type::User)
}
if key == "objectClass" && value.contains(&String::from("group"))
{
return Ok(Type::Group)
}
if key == "objectClass" && value.contains(&String::from("computer"))
{
return Ok(Type::Computer)
}
if key == "objectClass" && value.contains(&String::from("organizationalUnit"))
{
return Ok(Type::Ou)
}
if key == "objectClass" && value.contains(&String::from("domain"))
{
return Ok(Type::Domain)
}
if key == "objectClass" && value.contains(&String::from("groupPolicyContainer"))
{
return Ok(Type::Gpo)
}
if key == "objectClass" && value.contains(&String::from("top")) && value.contains(&String::from("foreignSecurityPrincipal"))
{
return Ok(Type::ForeignSecurityPrincipal)
}
if key == "objectClass" && (value.contains(&String::from("top")) && value.contains(&String::from("container"))) && !value.contains(&String::from("groupPolicyContainer"))
{
return Ok(Type::Container)
}
if key == "objectClass" && value.contains(&String::from("trustedDomain"))
{
return Ok(Type::Trust)
}
if key == "objectClass" && value.contains(&String::from("pKIEnrollmentService"))
{
return Ok(Type::AdcsAuthority)
}
if key == "objectClass" && value.contains(&String::from("pKICertificateTemplate"))
{
return Ok(Type::AdcsTemplate)
}
}
return Err(Type::Unknown)
}