del.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // https://tools.ietf.org/html/rfc4511
  3. //
  4. // DelRequest ::= [APPLICATION 10] LDAPDN
  5. package ldap
  6. import (
  7. "errors"
  8. "log"
  9. "gopkg.in/asn1-ber.v1"
  10. )
  11. type DelRequest struct {
  12. DN string
  13. Controls []Control
  14. }
  15. func (d DelRequest) encode() *ber.Packet {
  16. request := ber.Encode(ber.ClassApplication, ber.TypePrimitive, ApplicationDelRequest, d.DN, "Del Request")
  17. request.Data.Write([]byte(d.DN))
  18. return request
  19. }
  20. func NewDelRequest(DN string,
  21. Controls []Control) *DelRequest {
  22. return &DelRequest{
  23. DN: DN,
  24. Controls: Controls,
  25. }
  26. }
  27. func (l *Conn) Del(delRequest *DelRequest) error {
  28. messageID := l.nextMessageID()
  29. packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
  30. packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
  31. packet.AppendChild(delRequest.encode())
  32. if delRequest.Controls != nil {
  33. packet.AppendChild(encodeControls(delRequest.Controls))
  34. }
  35. l.Debug.PrintPacket(packet)
  36. channel, err := l.sendMessage(packet)
  37. if err != nil {
  38. return err
  39. }
  40. if channel == nil {
  41. return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
  42. }
  43. defer l.finishMessage(messageID)
  44. l.Debug.Printf("%d: waiting for response", messageID)
  45. packet = <-channel
  46. l.Debug.Printf("%d: got response %p", messageID, packet)
  47. if packet == nil {
  48. return NewError(ErrorNetwork, errors.New("ldap: could not retrieve message"))
  49. }
  50. if l.Debug {
  51. if err := addLDAPDescriptions(packet); err != nil {
  52. return err
  53. }
  54. ber.PrintPacket(packet)
  55. }
  56. if packet.Children[1].Tag == ApplicationDelResponse {
  57. resultCode, resultDescription := getLDAPResultCode(packet)
  58. if resultCode != 0 {
  59. return NewError(resultCode, errors.New(resultDescription))
  60. }
  61. } else {
  62. log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
  63. }
  64. l.Debug.Printf("%d: returning", messageID)
  65. return nil
  66. }