rusthound_ce/enums/
ldaptype.rsuse ldap3::SearchEntry;
use std::collections::HashMap;
use std::fmt;
pub enum Type {
User,
Computer,
Group,
Ou,
Domain,
Gpo,
ForeignSecurityPrincipal,
Container,
Trust,
RootCA,
NtAutStore,
EnterpriseCA,
AIACA,
CertTemplate,
Unknown
}
impl fmt::Debug for Type {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
pub fn get_type(result: SearchEntry) -> std::result::Result<Type, Type>
{
let result_attrs: HashMap<String, Vec<String>> = result.attrs;
let contains = | values: &Vec<String>, to_find: &str | {
values.iter().any( |elem| elem == to_find )
};
for (key, vals) in &result_attrs
{
if key != "objectClass" {
continue;
}
if contains(vals, "person") && contains(vals, "user") && !contains(vals, "computer") && !contains(vals, "group")
{
return Ok(Type::User)
}
if contains(vals, "msDS-GroupManagedServiceAccount")
{
return Ok(Type::User)
}
if contains(vals, "group")
{
return Ok(Type::Group)
}
if contains(vals, "computer")
{
return Ok(Type::Computer)
}
if contains(vals, "organizationalUnit")
{
return Ok(Type::Ou)
}
if contains(vals, "domain")
{
return Ok(Type::Domain)
}
if contains(vals, "groupPolicyContainer")
{
return Ok(Type::Gpo)
}
if contains(vals, "top") && contains(vals, "foreignSecurityPrincipal")
{
return Ok(Type::ForeignSecurityPrincipal)
}
if (contains(vals, "top") && contains(vals, "container")) && !contains(vals, "groupPolicyContainer")
{
return Ok(Type::Container)
}
if contains(vals, "trustedDomain")
{
return Ok(Type::Trust)
}
if contains(vals, "certificationAuthority")
&& result.dn.contains(DirectoryPaths::ROOT_CA_LOCATION)
{
return Ok(Type::RootCA)
}
if contains(vals, "pKIEnrollmentService")
&& result.dn.contains(DirectoryPaths::ENTERPRISE_CA_LOCATION)
{
return Ok(Type::EnterpriseCA)
}
if contains(vals, "pKICertificateTemplate")
&& result.dn.contains(DirectoryPaths::CERT_TEMPLATE_LOCATION)
{
return Ok(Type::CertTemplate)
}
if contains(vals, "certificationAuthority")
&& result.dn.contains(DirectoryPaths::AIA_CA_LOCATION)
{
return Ok(Type::AIACA)
}
if contains(vals, "certificationAuthority")
&& result.dn.contains(DirectoryPaths::NT_AUTH_STORE_LOCATION)
{
return Ok(Type::NtAutStore)
}
}
return Err(Type::Unknown)
}
pub struct DirectoryPaths;
impl DirectoryPaths {
pub const ENTERPRISE_CA_LOCATION : &'static str = "CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration";
pub const ROOT_CA_LOCATION : &'static str = "CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration";
pub const AIA_CA_LOCATION : &'static str = "CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration";
pub const CERT_TEMPLATE_LOCATION : &'static str = "CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration";
pub const NT_AUTH_STORE_LOCATION : &'static str = "CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration";
pub const PKI_LOCATION : &'static str = "CN=Public Key Services,CN=Services,CN=Configuration";
pub const CONFIG_LOCATION : &'static str = "CN=Configuration";
}