compare.go 1.7 KB

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