moddn.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package ldap
  2. import (
  3. "log"
  4. ber "github.com/go-asn1-ber/asn1-ber"
  5. )
  6. // ModifyDNRequest holds the request to modify a DN
  7. type ModifyDNRequest struct {
  8. DN string
  9. NewRDN string
  10. DeleteOldRDN bool
  11. NewSuperior string
  12. }
  13. // NewModifyDNRequest creates a new request which can be passed to ModifyDN().
  14. //
  15. // To move an object in the tree, set the "newSup" to the new parent entry DN. Use an
  16. // empty string for just changing the object's RDN.
  17. //
  18. // For moving the object without renaming, the "rdn" must be the first
  19. // RDN of the given DN.
  20. //
  21. // A call like
  22. // mdnReq := NewModifyDNRequest("uid=someone,dc=example,dc=org", "uid=newname", true, "")
  23. // will setup the request to just rename uid=someone,dc=example,dc=org to
  24. // uid=newname,dc=example,dc=org.
  25. func NewModifyDNRequest(dn string, rdn string, delOld bool, newSup string) *ModifyDNRequest {
  26. return &ModifyDNRequest{
  27. DN: dn,
  28. NewRDN: rdn,
  29. DeleteOldRDN: delOld,
  30. NewSuperior: newSup,
  31. }
  32. }
  33. func (req *ModifyDNRequest) appendTo(envelope *ber.Packet) error {
  34. pkt := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationModifyDNRequest, nil, "Modify DN Request")
  35. pkt.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, req.DN, "DN"))
  36. pkt.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, req.NewRDN, "New RDN"))
  37. pkt.AppendChild(ber.NewBoolean(ber.ClassUniversal, ber.TypePrimitive, ber.TagBoolean, req.DeleteOldRDN, "Delete old RDN"))
  38. if req.NewSuperior != "" {
  39. pkt.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, req.NewSuperior, "New Superior"))
  40. }
  41. envelope.AppendChild(pkt)
  42. return nil
  43. }
  44. // ModifyDN renames the given DN and optionally move to another base (when the "newSup" argument
  45. // to NewModifyDNRequest() is not "").
  46. func (l *Conn) ModifyDN(m *ModifyDNRequest) error {
  47. msgCtx, err := l.doRequest(m)
  48. if err != nil {
  49. return err
  50. }
  51. defer l.finishMessage(msgCtx)
  52. packet, err := l.readPacket(msgCtx)
  53. if err != nil {
  54. return err
  55. }
  56. if packet.Children[1].Tag == ApplicationModifyDNResponse {
  57. err := GetLDAPError(packet)
  58. if err != nil {
  59. return err
  60. }
  61. } else {
  62. log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
  63. }
  64. return nil
  65. }