1package ldap 2 3import ( 4 "fmt" 5 6 ber "github.com/go-asn1-ber/asn1-ber" 7) 8 9// CompareRequest represents an LDAP CompareRequest operation. 10type CompareRequest struct { 11 DN string 12 Attribute string 13 Value string 14} 15 16func (req *CompareRequest) appendTo(envelope *ber.Packet) error { 17 pkt := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationCompareRequest, nil, "Compare Request") 18 pkt.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, req.DN, "DN")) 19 20 ava := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "AttributeValueAssertion") 21 ava.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, req.Attribute, "AttributeDesc")) 22 ava.AppendChild(ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, req.Value, "AssertionValue")) 23 24 pkt.AppendChild(ava) 25 26 envelope.AppendChild(pkt) 27 28 return nil 29} 30 31// Compare checks to see if the attribute of the dn matches value. Returns true if it does otherwise 32// false with any error that occurs if any. 33func (l *Conn) Compare(dn, attribute, value string) (bool, error) { 34 msgCtx, err := l.doRequest(&CompareRequest{ 35 DN: dn, 36 Attribute: attribute, 37 Value: value}) 38 if err != nil { 39 return false, err 40 } 41 defer l.finishMessage(msgCtx) 42 43 packet, err := l.readPacket(msgCtx) 44 if err != nil { 45 return false, err 46 } 47 48 if packet.Children[1].Tag == ApplicationCompareResponse { 49 err := GetLDAPError(packet) 50 51 switch { 52 case IsErrorWithCode(err, LDAPResultCompareTrue): 53 return true, nil 54 case IsErrorWithCode(err, LDAPResultCompareFalse): 55 return false, nil 56 default: 57 return false, err 58 } 59 } 60 return false, fmt.Errorf("unexpected Response: %d", packet.Children[1].Tag) 61} 62