< Summary

Class:SharpHoundCommonLib.SearchResultEntryWrapper
Assembly:SharpHoundCommonLib
File(s):D:\a\SharpHoundCommon\SharpHoundCommon\src\CommonLib\DirectoryObjects\SearchResultEntryWrapper.cs
Covered lines:0
Uncovered lines:136
Coverable lines:136
Total lines:204
Line coverage:0% (0 of 136)
Covered branches:0
Total branches:68
Branch coverage:0% (0 of 68)

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%100%
TryGetDistinguishedName(...)0%200%
TryGetProperty(...)0%800%
TryGetByteProperty(...)0%800%
TryGetArrayProperty(...)0%600%
TryGetByteArrayProperty(...)0%400%
TryGetLongProperty(...)0%200%
TryGetCertificateArrayProperty(...)0%600%
TryGetSecurityIdentifier(...)0%800%
TryGetGuid(...)0%200%
GetProperty(...)0%800%
GetByteProperty(...)0%800%
PropertyCount(...)0%200%
PropertyNames()0%400%

File(s)

D:\a\SharpHoundCommon\SharpHoundCommon\src\CommonLib\DirectoryObjects\SearchResultEntryWrapper.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.DirectoryServices.Protocols;
 4using System.Runtime.Serialization;
 5using System.Security.Cryptography.X509Certificates;
 6using System.Security.Principal;
 7
 8namespace SharpHoundCommonLib;
 9[DataContract]
 10public class SearchResultEntryWrapper : IDirectoryObject {
 11    [DataMember]
 12    private readonly SearchResultEntry _entry;
 13
 014    public SearchResultEntryWrapper(SearchResultEntry entry) {
 015        _entry = entry;
 016    }
 17
 018    public bool TryGetDistinguishedName(out string value) {
 019        return TryGetProperty(LDAPProperties.DistinguishedName, out value) && !string.IsNullOrWhiteSpace(value);
 020    }
 21
 022    public bool TryGetProperty(string propertyName, out string value) {
 023        value = string.Empty;
 024        if (!_entry.Attributes.Contains(propertyName))
 025            return false;
 26
 027        var collection = _entry.Attributes[propertyName];
 28        //Use GetValues to auto-convert to the proper type
 029        var lookups = collection.GetValues(typeof(string));
 030        if (lookups.Length == 0)
 031            return false;
 32
 033        if (lookups[0] is not string prop || prop.Length == 0)
 034            return false;
 35
 036        value = prop;
 037        return true;
 038    }
 39
 040    public bool TryGetByteProperty(string propertyName, out byte[] value) {
 041        value = Array.Empty<byte>();
 042        if (!_entry.Attributes.Contains(propertyName))
 043            return false;
 44
 045        var collection = _entry.Attributes[propertyName];
 046        var lookups = collection.GetValues(typeof(byte[]));
 47
 048        if (lookups.Length == 0)
 049            return false;
 50
 051        if (lookups[0] is not byte[] bytes || bytes.Length == 0)
 052            return false;
 53
 054        value = bytes;
 055        return true;
 056    }
 57
 058    public bool TryGetArrayProperty(string propertyName, out string[] value) {
 059        value = Array.Empty<string>();
 060        if (!_entry.Attributes.Contains(propertyName))
 061            return false;
 62
 063        var values = _entry.Attributes[propertyName];
 064        var strings = values.GetValues(typeof(string));
 65
 066        if (strings.Length == 0) return true;
 067        if (strings is not string[] result) return false;
 68
 069        value = result;
 070        return true;
 071    }
 72
 073    public bool TryGetByteArrayProperty(string propertyName, out byte[][] value) {
 074        value = Array.Empty<byte[]>();
 075        if (!_entry.Attributes.Contains(propertyName))
 076            return false;
 77
 078        var values = _entry.Attributes[propertyName];
 079        var bytes = values.GetValues(typeof(byte[]));
 80
 081        if (bytes is not byte[][] result) return false;
 082        value = result;
 083        return true;
 084    }
 85
 086    public bool TryGetLongProperty(string propertyName, out long value) {
 087        if (!TryGetProperty(propertyName, out var raw)) {
 088            value = 0;
 089            return false;
 90        }
 91
 092        return long.TryParse(raw, out value);
 093    }
 94
 095    public bool TryGetCertificateArrayProperty(string propertyName, out X509Certificate2[] value) {
 096        value = Array.Empty<X509Certificate2>();
 97
 098        if (!TryGetByteArrayProperty(propertyName, out var bytes)) {
 099            return false;
 100        }
 101
 0102        if (bytes.Length == 0) {
 0103            return true;
 104        }
 105
 0106        var result = new List<X509Certificate2>();
 107
 0108        foreach (var b in bytes) {
 0109            try {
 0110                var cert = new X509Certificate2(b);
 0111                result.Add(cert);
 0112            } catch {
 113                //pass
 0114            }
 0115        }
 116
 0117        value = result.ToArray();
 0118        return true;
 0119    }
 120
 0121    public bool TryGetSecurityIdentifier(out string securityIdentifier) {
 0122        securityIdentifier = string.Empty;
 0123        if (!_entry.Attributes.Contains(LDAPProperties.ObjectSID)) return false;
 124
 125        object[] s;
 0126        try {
 0127            s = _entry.Attributes[LDAPProperties.ObjectSID].GetValues(typeof(byte[]));
 0128        } catch (NotSupportedException) {
 0129            return false;
 130        }
 131
 0132        if (s.Length == 0)
 0133            return false;
 134
 0135        if (s[0] is not byte[] sidBytes || sidBytes.Length == 0)
 0136            return false;
 137
 0138        try {
 0139            var sid = new SecurityIdentifier(sidBytes, 0);
 0140            securityIdentifier = sid.Value.ToUpper();
 0141            return true;
 0142        } catch {
 0143            return false;
 144        }
 0145    }
 146
 0147    public bool TryGetGuid(out string guid) {
 0148        guid = string.Empty;
 0149        if (!TryGetByteProperty(LDAPProperties.ObjectGUID, out var raw)) {
 0150            return false;
 151        }
 152
 0153        try {
 0154            guid = new Guid(raw).ToString().ToUpper();
 0155            return true;
 0156        } catch {
 0157            return false;
 158        }
 0159    }
 160
 0161    public string GetProperty(string propertyName) {
 0162        if (!_entry.Attributes.Contains(propertyName))
 0163            return null;
 164
 0165        var collection = _entry.Attributes[propertyName];
 166        //Use GetValues to auto-convert to the proper type
 0167        var lookups = collection.GetValues(typeof(string));
 0168        if (lookups.Length == 0)
 0169            return null;
 170
 0171        if (lookups[0] is not string prop || prop.Length == 0)
 0172            return null;
 173
 0174        return prop;
 0175    }
 176
 0177    public byte[] GetByteProperty(string propertyName) {
 0178        if (!_entry.Attributes.Contains(propertyName))
 0179            return null;
 180
 0181        var collection = _entry.Attributes[propertyName];
 0182        var lookups = collection.GetValues(typeof(byte[]));
 183
 0184        if (lookups.Length == 0)
 0185            return Array.Empty<byte>();
 186
 0187        if (lookups[0] is not byte[] bytes || bytes.Length == 0)
 0188            return Array.Empty<byte>();
 189
 0190        return bytes;
 0191    }
 192
 0193    public int PropertyCount(string propertyName) {
 0194        if (!_entry.Attributes.Contains(propertyName)) return 0;
 0195        var prop = _entry.Attributes[propertyName];
 0196        return prop.Count;
 0197    }
 198
 0199    public IEnumerable<string> PropertyNames() {
 0200        if (_entry.Attributes.AttributeNames != null)
 0201            foreach (var property in _entry.Attributes.AttributeNames)
 0202                yield return property.ToString().ToLower();
 0203    }
 204}