...
1 package ldap
2
3 import (
4 "fmt"
5
6 ber "github.com/go-asn1-ber/asn1-ber"
7 )
8
9
10 type CompareRequest struct {
11 DN string
12 Attribute string
13 Value string
14 }
15
16 func (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
32
33 func (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 })
39 if err != nil {
40 return false, err
41 }
42 defer l.finishMessage(msgCtx)
43
44 packet, err := l.readPacket(msgCtx)
45 if err != nil {
46 return false, err
47 }
48
49 if packet.Children[1].Tag == ApplicationCompareResponse {
50 err := GetLDAPError(packet)
51
52 switch {
53 case IsErrorWithCode(err, LDAPResultCompareTrue):
54 return true, nil
55 case IsErrorWithCode(err, LDAPResultCompareFalse):
56 return false, nil
57 default:
58 return false, err
59 }
60 }
61 return false, fmt.Errorf("unexpected Response: %d", packet.Children[1].Tag)
62 }
63
View as plain text