bind.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ldap
  5. import (
  6. "errors"
  7. "github.com/nmcclain/asn1-ber"
  8. )
  9. func (l *Conn) Bind(username, password string) error {
  10. messageID := l.nextMessageID()
  11. packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
  12. packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
  13. bindRequest := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationBindRequest, nil, "Bind Request")
  14. bindRequest.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, 3, "Version"))
  15. bindRequest.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, username, "User Name"))
  16. bindRequest.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, password, "Password"))
  17. packet.AppendChild(bindRequest)
  18. if l.Debug {
  19. ber.PrintPacket(packet)
  20. }
  21. channel, err := l.sendMessage(packet)
  22. if err != nil {
  23. return err
  24. }
  25. if channel == nil {
  26. return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
  27. }
  28. defer l.finishMessage(messageID)
  29. packet = <-channel
  30. if packet == nil {
  31. return NewError(ErrorNetwork, errors.New("ldap: could not retrieve response"))
  32. }
  33. if l.Debug {
  34. if err := addLDAPDescriptions(packet); err != nil {
  35. return err
  36. }
  37. ber.PrintPacket(packet)
  38. }
  39. resultCode, resultDescription := getLDAPResultCode(packet)
  40. if resultCode != 0 {
  41. return NewError(resultCode, errors.New(resultDescription))
  42. }
  43. return nil
  44. }
  45. func (l *Conn) Unbind() error {
  46. defer l.Close()
  47. messageID := l.nextMessageID()
  48. packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
  49. packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID"))
  50. unbindRequest := ber.Encode(ber.ClassApplication, ber.TypePrimitive, ApplicationUnbindRequest, nil, "Unbind Request")
  51. packet.AppendChild(unbindRequest)
  52. if l.Debug {
  53. ber.PrintPacket(packet)
  54. }
  55. channel, err := l.sendMessage(packet)
  56. if err != nil {
  57. return err
  58. }
  59. if channel == nil {
  60. return NewError(ErrorNetwork, errors.New("ldap: could not send message"))
  61. }
  62. defer l.finishMessage(messageID)
  63. packet = <-channel
  64. if packet == nil {
  65. return NewError(ErrorNetwork, errors.New("ldap: could not retrieve response"))
  66. }
  67. if l.Debug {
  68. if err := addLDAPDescriptions(packet); err != nil {
  69. return err
  70. }
  71. ber.PrintPacket(packet)
  72. }
  73. resultCode, resultDescription := getLDAPResultCode(packet)
  74. if resultCode != 0 {
  75. return NewError(resultCode, errors.New(resultDescription))
  76. }
  77. return nil
  78. }